sql server - How to copy branch with hierarchyid? -


मेरे पास फ़ील्ड के साथ एक साधारण तालिका है:

  catalog_id hierarchyid नल अद्वितीय, item_id int नहीं शून्य पहचान (1,1), आइटम_नाम एनवर्चार (50) नल,  

यहां छवि विवरण दर्ज करें

मुझे एक संग्रहीत प्रक्रिया बनाने की ज़रूरत है जो शाखा को किसी अन्य अभिभावक से कॉपी कर देगा। उदाहरण के लिए, ऐसा कुछ:

यहां छवि विवरण दर्ज करें

मैंने एक शाखा को एक अभिभावक से स्थानांतरित करने की प्रक्रिया की है दूसरे के लिए, यहां यह है:

  वैकल्पिक प्रक्रिया [dbo]। [Move_child] @ चाइल्डआइएनआईटी, @ न्यूपेरेंटआईडी एएनएस के रूप में अनिर्धारित @ नामित पदानुक्रम, @ एनएनयू पदानुक्रम का चयन करें @nold = catalog_id कैटलॉग से जहां धरती Item_id = @ChildId सेट ट्रांसलेशन एस्लोमेशन लेवल सिरिअलज्याबल ट्रांस्सेक्शन का चयन करें @nnew = catalog_id से कैटलॉगसैट्री WHERE item_id = @NewParentId का चयन करें @nnew = @ nnew.GetDescendan टी (अधिकतम (कैटलॉग_आईडी), नल) से कैटलॉग टीरी WHERE catalog_id.GetAncestor (1) = @ nnew; अद्यतन कैटलॉगट्री एसईटी कैटलॉग_आईडी = कैटलॉग_id.GetReparentedValue (@nold, @nnew) WHERE catalog_id.IsDescendantOf (@nold) = 1; कॉममिट ट्रांस्नाइक्शन  

लेकिन अब मुझे एक समान पदानुक्रम और item_name के साथ एक कॉपी बनाने की आवश्यकता है।

मैंने इसे अस्थायी तालिका बना दिया है

  वैकल्पिक प्रक्रिया [dbo]। [Copy_child] @ फ़ोल्डर_id int, @new_parent_id int as BEGIN  

अस्थायी तालिका बनाएं:

  तालिका बनाने के लिए #temp_table (catalog_id hierarchyid not unique unique, item_id int null, item_name nvarchar (50) NOT null)  

कॉपी शाखा को अस्थायी तालिका में:

  declare @olderId hierarchyid @olderId = (कैटलॉगट्री से कैटलॉग_id का चयन करें जहां item_id = @ folder_id) #temp_table (सूची_आइट, मद_आईडी, आइटम_नाम) में शामिल करें SELECT Catalog_id, item_id, item_name सूचीपत्र से जहां catalog_id.IsDescendantOf (@olderId) = 1  

कैटलॉग_id बदलें:

  घोषणा @ नामित पदानुक्रम, @ नई पदानुक्रम का चयन करें @nold = catalog_id कैटलॉग से कहां से item_id = @ फ़ोल्डर_आईड SET लेनदेन एसोसिएशन स्तर एसईआरआईजी ट्रांसलेशन एक्टिवेट करें @nnew = catalog_id से कैटलॉगट्री WHERE item_id = @new_parent_id SELECT @new = @ nnew.GetDescendant (मैक्स (कैटलॉग_आईडी), NULL) कैटलॉगट्री WHERE catalog_id.GetAncestor (1) = @nnew; UPDATE #temp_table SET catalog_id = catalog_id.GetReparentedValue (@nold, @nnew) WHERE catalog_id.IsDescendantOf (@nold) = 1; कॉमटम ट्रांस्नाइक्शन  

मुख्य तालिका में परिवर्तित किए गए मान कॉपी करें:

  कैटलॉगट्री में प्रविष्ट करें (कैटलॉग_आईडी, आइटम_नाम) SELECT catalog_id, #temp_table ड्रॉप तालिका #temp_table END से item_name  

Comments

Popular posts from this blog

apache - 504 Gateway Time-out The server didn't respond in time. How to fix it? -

c# - .net WebSocket: CloseOutputAsync vs CloseAsync -

c++ - How to properly scale qgroupbox title with stylesheet for high resolution display? -