आप (ab) उपयोग कर सकते हैं MERGE
OUTPUT के साथ खंड।
MERGE कर सकते हैं INSERT , UPDATE और DELETE पंक्तियाँ। हमारे मामले में हमें केवल INSERT . की आवश्यकता है .1=0 हमेशा झूठा होता है, इसलिए NOT MATCHED BY TARGET भाग हमेशा निष्पादित होता है। सामान्य तौर पर, अन्य शाखाएं हो सकती हैं, दस्तावेज़ देखें।WHEN MATCHED आमतौर पर UPDATE . के लिए उपयोग किया जाता है;WHEN NOT MATCHED BY SOURCE आमतौर पर DELETE . के लिए उपयोग किया जाता है , लेकिन हमें यहां उनकी आवश्यकता नहीं है।
MERGE . का यह जटिल रूप सरल INSERT . के बराबर है , लेकिन साधारण INSERT . के विपरीत इसका OUTPUT खंड उन स्तंभों को संदर्भित करने की अनुमति देता है जिनकी हमें आवश्यकता है। यह स्रोत और गंतव्य तालिका दोनों से स्तंभों को पुनः प्राप्त करने की अनुमति देता है इस प्रकार पुरानी और नई आईडी के बीच मानचित्रण को सहेजता है।
MERGE INTO [dbo].[Test]
USING
(
SELECT [Data]
FROM @Old AS O
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT ([Data])
VALUES (Src.[Data])
OUTPUT Src.ID AS OldID, inserted.ID AS NewID
INTO @New(ID, [OtherID])
;
आपके अपडेट के संबंध में और जेनरेट किए गए IDENTITY . के क्रम पर निर्भर मान।
साधारण स्थिति में, जब [dbo].[Test] IDENTITY है कॉलम, फिर INSERT ORDER BY . के साथ होगा गारंटी है कि उत्पन्न IDENTITY मान निर्दिष्ट क्रम में होंगे। एसक्यूएल सर्वर में गारंटी ऑर्डर करना . ध्यान रहे, यह सम्मिलित पंक्तियों के भौतिक क्रम की गारंटी नहीं देता है, लेकिन यह उस क्रम की गारंटी देता है जिसमें IDENTITY मान उत्पन्न होते हैं।
INSERT INTO [dbo].[Test] ([Data])
SELECT [Data]
FROM @Old
ORDER BY [RowID]
लेकिन, जब आप OUTPUT . का उपयोग करते हैं खंड:
INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID] INTO @New
SELECT [Data]
FROM @Old
ORDER BY [RowID]
OUTPUT में पंक्तियाँ धारा का आदेश नहीं है। कम से कम, कड़ाई से बोलते हुए, ORDER BY क्वेरी में प्राथमिक INSERT . पर लागू होता है ऑपरेशन, लेकिन वहाँ कुछ भी नहीं है जो कहता है कि OUTPUT . का क्रम क्या है . इसलिए, मैं उस पर भरोसा करने की कोशिश नहीं करूंगा। या तो MERGE का उपयोग करें या आईडी के बीच मैपिंग को स्पष्ट रूप से संग्रहीत करने के लिए एक अतिरिक्त कॉलम जोड़ें।