2009-06-10 10 views
11

मैं एक autoincrementing कुंजी फ़ील्ड के साथ एक SQLServer तालिका में डाल रहा हूँ। (मेरा मानना ​​है कि इस SQLServer में एक पहचान स्तंभ कहा जाता है।)मैं SQLServer SELECT कथन से एक नया पहचान कॉलम मान कैसे वापस कर सकता हूं?

ओरेकल में, मैं अपने सम्मिलित बयान एक चयन करें क्वेरी उत्पन्न मान प्रदान करेंगे की तरह सेट एक परिणाम देने के लिए लौट कीवर्ड का उपयोग कर सकते हैं:

INSERT INTO table 
(foreign_key1, value) 
VALUES 
(9, 'text') 
RETURNING key_field INTO :var; 

मैं SQLServer में इसे कैसे पूरा करूं?

बोनस: ठीक है, अब तक अच्छे जवाब हैं, लेकिन यदि संभव हो तो मैं इसे एक ही कथन में कैसे डालूं? :)

+0

जोड़ा गया "एक कॉल" उदाहरण। – gbn

उत्तर

17

सामान्यतः, यह एक ही कथन में नहीं किया जा सकता है।

लेकिन चयन SCOPE_IDENTITY() INSERT कथन के बाद सीधे (और चाहिए) रखा जा सकता है, इसलिए यह सब एक ही डेटाबेस कॉल में किया जाता है।

उदाहरण:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();"); 

आप आउटपुट का उपयोग कर सकते हैं, लेकिन यह कुछ सीमाएं आप के बारे में पता होना चाहिए है: (foreign_key1, मूल्य) मान तालिका में

http://msdn.microsoft.com/en-us/library/ms177564.aspx

+4

अविश्वसनीय। मुझे नहीं पता था कि मैं इस तरह के बयान गठबंधन कर सकता हूं। चालाक, गैर मानक, घृणित, उपयोगी ... इन सभी विशेषणों को ध्यान में आता है। :) – skiphoppy

+1

यह SQL सर्वर 2005 में OUTPUT के साथ एक कथन में किया जा सकता है – gbn

9
SELECT SCOPE_IDENTITY() 

संपादित करें: एक नाटक करने के बाद ...

अगर केवल OUTPUT खंड स्थानीय चर का समर्थन किया।

वैसे भी, बल्कि एक सिंगलटन

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
SELECT 'harry' 
UNION ALL 
SELECT 'dick' 
UNION ALL 
SELECT 'tom' 

संपादित 2 से आईडी की एक सीमा प्राप्त करने के लिए: एक कॉल में। मुझे इस निर्माण का उपयोग करने का अवसर कभी नहीं मिला है।

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
VALUES('foobar') 
+0

मैं इसे दूसरा करता हूं। SCOPE_IDENTITY() आपकी सबसे हाल की क्वेरी के दायरे में सबसे हाल की पहचान देता है। अन्य विधियों @@ पहचान और IDENT_CURRENT() एक विशिष्ट दायरे तक सीमित नहीं हैं –

+0

hhmm इस उत्तर के लिए एक अज्ञात डाउनवोट ... – gbn

4

इसके अलावा पहचान @@ के लिए, आप भी SCOPE_IDENTITY() और IDENT_CURRENT ध्यान देना चाहिए()। आप शायद SCOPE_IDENTITY() चाहते हैं। @@ पहचान में कोई समस्या है कि यह उस वास्तविक तालिका पर ट्रिगर में बनाए गए पहचान मान को वापस कर सकता है जिसे आप ट्रैक करने का प्रयास कर रहे हैं।

इसके अलावा, ये सिंगल-वैल्यू फ़ंक्शंस हैं। मुझे नहीं पता कि ओरेकल रिटर्निंग कीवर्ड कैसे काम करता है।

0

आप OUTPUT INTO का उपयोग कर सकते हैं, जिसमें कई पहचान डालने में सक्षम होने के अतिरिक्त लाभ हैं।

0

सम्मिलित करें (9, 'टेक्स्ट'); चयन @@ पहचान;

2

यह आपके कॉलिंग संदर्भ पर निर्भर करता है।

यदि आप इसे क्लाइंट कोड से कॉल कर रहे हैं, तो आप OUTPUT का उपयोग कर सकते हैं और फिर मान वापस लौटा सकते हैं।

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) 
OUTPUT Inserted.ColID 
VALUES ('Hello World') 

परिणाम:

 ColID 
----------- 
      1 

आप एक संग्रहीत प्रक्रिया में इस लपेटकर रहे हैं, आउटपुट का उपयोग कर अधिक काम है। वहां, आप SCOPE_IDENTITY() का उपयोग करना चाहेंगे, लेकिन आप इसे एक ही कथन में नहीं कर सकते हैं। निश्चित रूप से, आप एक पंक्ति पर 'कथन' के साथ कई कथन डाल सकते हैं विभाजक, लेकिन यह एक भी बयान नहीं है।

DECLARE @idValue int 
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) VALUES ('Hello World') 

SELECT @idValue = SCOPE_IDENTITY() 

परिणाम: @idValue चर पहचान मान है। मान वापस करने के लिए एक OUTPUT पैरामीटर का उपयोग करें।

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