2008-09-10 6 views
12

SQL सर्वर 2005 में मेरे पास एक तालिका में "आईडी" फ़ील्ड है जिसमें "पहचान है" प्रॉपर्टी 'हां' पर सेट है। इसलिए, जब उस तालिका में एक सम्मिलित किया जाता है तो "आईडी" स्वचालित रूप से अगले incrementing पूर्णांक पर सेट हो जाता है। क्या कोई आसान तरीका है जब सम्मिलन के बाद सही चयन कथन के बिना "आईडी" सेट करने के लिए सम्मिलित किया जाता है?SQL सर्वर में सम्मिलित होने पर रिकॉर्ड के "आईडी" को प्राप्त करना संभव है?

की डुप्लीकेट:
Best way to get identity of inserted row?

उत्तर

32

नेट में कम से कम, आप कई प्रश्नों सर्वर से एक ही बार में भेज सकते हैं। मैं इसे अपने ऐप में करता हूं:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; 
int id = (int)command.ExecuteScalar(); 

एक आकर्षण की तरह काम करता है।

+3

यह समाधान अच्छा जब केवल एकल पंक्ति के अपडेट के साथ काम कर रहा है। एक अच्छा थोक अद्यतन समाधान के लिए कामोजो का जवाब देखें। – CodeWarrior

+1

उन लोगों के लिए जो इसे MySQL के साथ करना है: बस SCOPE_IDENTITY को LAST_INSERT_ID से प्रतिस्थापित करें। या MySqlCommand पर केवल LastInsertedId पैरामीटर का उपयोग करें; –

+0

मुझे ExecuteScalar() के वापसी मूल्य को सीधे एक int में कास्टिंग करने में त्रुटि मिलती है। जब मैं इसे दशमलव पर डालता हूं तो ठीक काम करता है। –

1

आप SCOPE_IDENTITY() फ़ंक्शन का चयन करने के लिए है।

एप्लिकेशन कोड से ऐसा करने के लिए, मैं आमतौर पर संग्रहीत प्रक्रिया में इस प्रक्रिया को समाहित करता हूं, इसलिए यह अभी भी मेरे आवेदन के लिए एक प्रश्न जैसा दिखता है।

2

SCOPE_IDENTITY(); तुम्हारा सबसे अच्छा शर्त है। और यदि आप .NET का उपयोग कर रहे हैं तो बस हमारे पैरामीटर को पास करें और प्रक्रिया चलाने के बाद मान की जांच करें।

CREATE PROCEDURE [dbo].[InsertProducts] 
    @id    INT    = NULL OUT, 
    @name   VARCHAR(150) = NULL, 
    @desc   VARCHAR(250) = NULL 

AS 

    INSERT INTO dbo.Products 
     (Name, 
     Description) 
    VALUES 
     (@name, 
     @desc) 

    SET @id = SCOPE_IDENTITY(); 
14

आप कई पंक्तियों डालने कर रहे हैं, insert बयान पर OUTPUT और INSERTED.columnname खंड का उपयोग एक अस्थायी तालिका में सभी आईडी होने का एक आसान तरीका है।

DECLARE @MyTableVar table(ID int, 
           Name varchar(50), 
           ModifiedDate datetime); 
INSERT MyTable 
     OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar 
SELECT someName, GetDate() from SomeTable 
+0

मुझे यह पसंद है! पारितोषिक के लिए धन्यवाद। – CodeWarrior

+0

बीटीडब्ल्यू, यह सुनिश्चित नहीं है कि यह संस्करण-विशिष्ट है (अब यह 2012 है और मैं SQL 10.0.1600 पर हूं) लेकिन आपको इसके लिए एक temp तालिका के माध्यम से जाना नहीं है - आप सीधे आउटपुट कर सकते हैं। मुझे यह भी पसंद है कि यह GUID फ़ील्ड के लिए भी काम करता है, अगर उन्हें पीके के रूप में उपयोग किया जाता है ... नहीं कि मैं इतना ऐसा करने का समर्थन करता हूं, लेकिन यह काम करता है। –

1

मैं एंटरप्राइज़ मैनेजर का उपयोग कर तालिका में ट्रिगर को जोड़ना पसंद करता हूं। इस तरह आपको अपने कोड में अतिरिक्त एसक्यूएल स्टेटमेंट लिखने के बारे में चिंता करने की आवश्यकता नहीं है। मेरा कुछ इस तरह दिखाई:

सम्मिलित के लिए उत्प्रेरक tblName बनाएं dbo.tblName पर चयन के रूप में NEW_ID = @@ पहचान

फिर, अपने कोड के भीतर से, चयन statements- की तरह अपने डालने बयान का इलाज बस परिणामों को निष्पादित और मूल्यांकन करें। "newID" कॉलम में आपके द्वारा बनाई गई पंक्ति की पहचान होगी।

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