Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

चयनित पंक्ति से मूल्य के साथ OUTPUT insert.id को मिलाएं

आप (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 का उपयोग करें या आईडी के बीच मैपिंग को स्पष्ट रूप से संग्रहीत करने के लिए एक अतिरिक्त कॉलम जोड़ें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप डेटाबेस में व्यू क्यों बनाते हैं?

  2. क्या चयन कथन में पिछली पंक्ति मान तक पहुंचने का कोई तरीका है?

  3. SQL सर्वर 2008 में गतिरोध प्राप्त करने के लिए SQL क्वेरी

  4. @@ त्रुटि और/या कोशिश करें - कैच

  5. तालिका पंक्तियों को संपादित करके SQL सर्वर तालिका में पंक्तियों को कैसे सम्मिलित करें GUI - SQL सर्वर / TSQL ट्यूटोरियल भाग 101