2011-06-02 10 views
10

निम्नलिखित साधारण परीक्षण तालिका को देखते हुए एक (गैर तालिका मूल्य) में पहचान स्तंभ के मूल्य प्राप्त करने के चर के बाद INSERTOUTPUT खंड का उपयोग कर, लेकिन यह काम नहीं करता:सम्मिलित करें के बाद आउटपुट का उपयोग चर

DECLARE @InsertedId BIGINT; 

INSERT INTO Test(Name) 
    OUTPUT @InsertedId=inserted.Id 
    VALUES ('Michael') 

-- Display resulting id for debugging 
SELECT @InsertedId; 
-- ... 

मैं मैं आसानी से INSERT के बाद इस SCOPE_IDENTITY() का उपयोग कर सकते है, लेकिन यहके हिस्से के रूप में यह करने के लिए संभव हैकथन OUTPUT क्लॉज का उपयोग किए बिना तालिका चर का उपयोग किए बिना?

अद्यतन, यह भी कानूनी नहीं है कि एक और काल्पनिक प्रयास:

-- Return the id as a result set 
INSERT INTO Test(Name) 
OUTPUT inserted.Id AS TheId 
VALUES ('Michael') 

-- But you can't use the result set as a derived table... 
SELECT TheId FROM 
(
    INSERT INTO Test(Name) 
    OUTPUT inserted.Id AS TheId 
    VALUES ('Michael') 
) 

-- ..., or you would be able to do this 
SELECT TOP 1 @InsertedId=TheId 
FROM 
(
    INSERT INTO Test(Name) 
    OUTPUT inserted.Id AS TheId 
    VALUES ('Michael') 
) 

उत्तर

13

आउटपुट क्लॉज का मान याद रखें कि यह एक से अधिक रिकॉर्ड और एक से अधिक फ़ील्ड लौटा सकता है। तो आप डेटा की एक सेट के लिए प्राकृतिक कुंजी और पहचान दोनों को आउटपुट कर सकते हैं ताकि आप बाल सारणी में एकाधिक रिकॉर्ड डालने के लिए सेट सिद्धांत का भी उपयोग कर सकें। आउटपुट बहुत शक्तिशाली है और इसका उपयोग करने के लिए इसका उपयोग करने के लिए भुगतान किया जाएगा।

वर्तमान में scope_identity() में एक बग है (लिंक देखें: http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) कि माइक्रोसॉफ्ट ठीक करने का इरादा नहीं रखता है। इससे आपको एक सुराग देना चाहिए कि क्या आपको नए विकास के लिए आउटपुट का उपयोग करना चाहिए, भले ही यह एकल रिकॉर्ड के लिए थोड़ा सा है।

+0

आपको उस लेख को इंगित करने के लिए चेकमार्क मिलता है! –

+3

+1 - यह चौंकाने वाला है (scope_identity() में बग), और भी अधिक है क्योंकि यह ठीक नहीं होने वाला है। –

+1

'scope_identity' बग के बारे में लिंक मेरे लिए काम नहीं कर रहा है - मैंने पाया [हालांकि एक और] [http://support.microsoft.com/kb/2019779) जहां वे दावा करते हैं कि SQL Server 2008 R2 SP1 के लिए कोई फिक्स है। अन्यथा, एक कामकाज के रूप में, वे एकल रिकॉर्ड के लिए भी 'आउटपुट' का उपयोग करने की सलाह देते हैं – andreister

6

नहीं, यह संभव नहीं है। एक आउटपुट खंड केवल तालिका/तालिका चर में आउटपुट कर सकता है, या कंपोज़ेबल डीएमएल (जो मदद नहीं करता) के लिए कॉलम की पहचान करने के लिए उपयोग किया जा सकता है। SCOPE_IDENTITY() सभी तरह से, माइकल।

+0

सहमत हैं। आउटपुट क्लॉज एक * रिकॉर्डसेट * देता है जिसे किसी तालिका में जाने की आवश्यकता होती है: स्केलर वेरिएबल – gbn

+0

@gbn को असाइन करने का कोई मतलब नहीं है: हालांकि रिकॉर्डसेट को OPENQUERY के साथ पढ़ा जा सकता है। लेकिन इसके लिए सर्वर को एक लिंक किए गए एक के रूप में स्थापित करने की आवश्यकता होगी। –

+0

मैंने आपको अपनी मान्यताओं की पुष्टि करने के लिए एक +1 दिया है, लेकिन एचएलजीईएम मूल रूप से इस तथ्य की पुष्टि करने के लिए चेकमार्क प्राप्त करता है कि '' '' '' '' '' '' '' 'समय के लिए आउटपुट का उपयोग किया जाना चाहिए। –

संबंधित मुद्दे