2012-11-19 16 views
15

मैं इस समस्या को एक सप्ताह और कोई चीज उपयोगी मुझे लगता है कि सही शब्दडालने

मैं एसक्यूएल सर्वर 2008 का उपयोग कर रहा T-SQL के साथ उपयोग नहीं कर रहा और googled है पर अंतिम पंक्ति के autoincrement का मूल्य प्राप्त करने के लिए कैसे जब मैं एक नई पंक्ति डालता हूं तो मेरी आवश्यकता को मेरे फ़ंक्शन को अनुकूलित करना है।

मैं पहले कॉलम के साथ एक मेज पूर्णांक autoincrement प्रकार और अन्य स्तंभों के प्रमुख बस जानकारी

जब हम एक डालने करते हैं, एसक्यूएल सर्वर स्वचालित रूप से प्रमुख वृद्धि कर देता है के लिए कर रहे है है और मैं करने के लिए एक का चयन अधिकतम करना है मूल्य मिलता है, तो वहाँ समाप्ति लेन-देन शुरू करते हैं और चयन अधिकतम

उत्तर

29

उपयोग SCOPE_IDENTITY से बचने के लिए या @@IDENTITY की तरह एक वैश्विक चर एक समारोह की तरह एक तरीका है:

-- do insert 

SELECT SCOPE_IDENTITY(); 

कौन होगा आपको:

अंतिम पहचान मान में एक समान कॉलम में एक पहचान कॉलम में डाला गया अंतिम पहचान मान। एक गुंजाइश एक मॉड्यूल है: एक संग्रहित प्रक्रिया, ट्रिगर, फ़ंक्शन, या बैच। इसलिए, यदि वे एक ही संग्रहीत प्रक्रिया, फ़ंक्शन या बैच में हैं, तो दो कथन एक ही दायरे में हैं।

-1
SELECT IDENT_CURRENT(‘tablename’) 

यह एक तालिका में उत्पादन पिछले पहचान मान देता है, कनेक्शन है कि मूल्य बनाई की परवाह किए बिना, और बयान है कि मूल्य का उत्पादन के दायरे की परवाह किए बिना। IDENT_CURRENT गुंजाइश और सत्र से सीमित नहीं है; यह एक निर्दिष्ट तालिका तक ही सीमित है। IDENT_CURRENT किसी भी सत्र और किसी भी दायरे में किसी विशिष्ट तालिका के लिए उत्पन्न पहचान मान देता है। http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

या इस:

से ले ली

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

से ले ली: http://network.convergenceservices.in/forum/22-ms-sql/384-get-last-inserted-record-id-in-ms-sql.html

+0

"SCOPE_IDENTITY" के साथ एकमात्र समस्या यह है कि यह किसी भी तालिका पर उत्पादित अंतिम आईडी मान देता है। आईएमओ आप हमेशा उस टेबल नाम को जानेंगे जिसमें आपने डेटा डाला या छेड़छाड़ की है और केवल उस तालिका से डेटा वापस खींचना चाहेंगे - बेल्ट और ब्रेसिज़। – Paul

+0

आपके द्वारा संदर्भित लिंक से: "हमेशा SCOPE_IDENTITY() का उपयोग करें"। आपके द्वारा डाले गए रिकॉर्ड की आईडी जानना बहुत अधिक संभावना है, अंतिम रिकॉर्ड नहीं। – podiluska

2

पिछले ऑटो वृद्धि मान

चयन IDENT_CURRENT ('TABLE_NAME' के लिए इस बारे में क्या) -IDENT_INCR ('table_name')

4

बस कोड भाग गया:

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

और यह भी काम करता है!

+2

क्या हो रहा है यदि किसी अन्य धागे से उन दो क्वेरी के बीच एक और सम्मिलन करें? – user2983041

0

आप MySQL का उपयोग कर रहे हैं, तो आप के साथ पिछले डालने का ऑटो वेतन वृद्धि आईडी प्राप्त:

SELECT LAST_INSERT_ID();

पूर्ण संदर्भ के लिए here देखें।

0

मेरे मामले में मुझे @@ पहचान का उपयोग करना पड़ा, क्योंकि मैं एक दृश्य में शामिल था। ऐसा लगता है कि SCOPE_IDENTITY केवल उन लोगों के लिए काम करता है जिन्हें आपने स्पष्ट रूप से बनाया है।

यहाँ देखें:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

@@ पहचान अपने वर्तमान सत्र में एक तालिका में प्रवेश पिछले पहचान मान प्रदान करेंगे। जबकि @@ पहचान वर्तमान सत्र तक सीमित है, यह वर्तमान दायरे तक ही सीमित नहीं है। यदि आपके पास किसी तालिका पर एक पहचान है जो किसी अन्य तालिका में पहचान बनने का कारण बनती है, तो आप को पिछली बार बनाई गई पहचान प्राप्त करेंगे, भले ही यह ट्रिगर बनाया गया हो।