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
Post a Comment