SQL सर्वर में, यदि आपको कभी भी किसी पहचान कॉलम में बनाए गए मान को वापस करने की आवश्यकता होती है, तो आपके पास कई विकल्प होते हैं। इनमें से प्रत्येक विकल्प, हालांकि समान हैं, थोड़ा अलग काम करते हैं।
विशेष रूप से, आप निम्नलिखित कार्यों का उपयोग कर सकते हैं:
IDENT_CURRENT()
किसी दी गई तालिका के लिए अंतिम-सम्मिलित पहचान मान लौटाता है।SCOPE_IDENTITY()
किसी भी . में किसी पहचान कॉलम में डाला गया अंतिम पहचान मान लौटाता है वर्तमान सत्र और वर्तमान कार्यक्षेत्र में तालिका।@@IDENTITY
किसी भी . में अंतिम बार डाला गया पहचान मान लौटाता है कार्यक्षेत्र की परवाह किए बिना वर्तमान सत्र में तालिका।
उदाहरण
यहां एक उदाहरण दिया गया है जो इन तीन कार्यों के बीच के अंतर को दर्शाता है।
सबसे पहले, दो टेबल बनाएं। प्रत्येक तालिका में पहचान कॉलम के लिए उपयोग किए जा रहे विभिन्न बीज और वृद्धि मूल्यों पर ध्यान दें:
CREATE TABLE t1(id int IDENTITY(1,1)); CREATE TABLE t2(id int IDENTITY(150,10));
अब एक ट्रिगर बनाएं जो पहली तालिका में एक पंक्ति डालने पर दूसरी तालिका में एक पंक्ति सम्मिलित करता है:
CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT AS BEGIN INSERT t2 DEFAULT VALUES END;
ट्रिगर एक अलग दायरे में आग लगाते हैं, इसलिए यहां मेरे उदाहरण के लिए यह बिल्कुल सही है।
पहली तालिका में डेटा डालें, फिर दोनों तालिकाओं से परिणाम चुनें:
INSERT t1 DEFAULT VALUES; SELECT id AS t1 FROM t1; SELECT id AS t2 FROM t2;
परिणाम:
+------+ | t1 | |------| | 1 | +------+ (1 row affected) +------+ | t2 | |------| | 150 | +------+ (1 row affected)
तो स्पष्ट होने के लिए, यह डेटा दो अलग-अलग क्षेत्रों द्वारा डाला गया था। t1 . में डालें वर्तमान दायरे द्वारा किया गया था। t2 . में डालें ट्रिगर द्वारा किया गया था, जो एक अलग दायरे में चलता था।
अब पहले बताए गए फंक्शन में से चुनें:
SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
परिणाम:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | 150 | 1 | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
@@IDENTITY
. द्वारा लौटाया गया परिणाम दायरे तक सीमित नहीं है, और इसलिए यह दायरे की परवाह किए बिना अंतिम-सम्मिलित पहचान मान लौटाता है।
SCOPE_IDENTITY()
पहली तालिका से पहचान मान लौटाता है, क्योंकि वह वर्तमान दायरे में अंतिम सम्मिलित-पहचान मान था (ट्रिगर वर्तमान दायरे से बाहर है)।
IDENT_CURRENT()
कार्यक्षेत्र या सत्र की परवाह किए बिना, फ़ंक्शन केवल निर्दिष्ट तालिका में डाला गया अंतिम पहचान मान देता है।
नया सत्र खोलें
अब, यदि मैं एक नया सत्र खोलता हूं और पिछले कथन को फिर से चलाता हूं तो क्या होता है:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
परिणाम:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | NULL | NULL | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
दोनों @@IDENTITY
और SCOPE_IDENTITY()
NULL हैं क्योंकि वे केवल वर्तमान सत्र से परिणाम लौटाते हैं। मैंने इस नए सत्र में कोई भी पहचान कॉलम सम्मिलित नहीं किया है, इसलिए मुझे NULL मिलता है।
IDENT_CURRENT()
दूसरी ओर, पिछले उदाहरण के समान ही परिणाम देता है, क्योंकि इसके परिणाम निर्दिष्ट तालिका पर आधारित होते हैं, सत्र या कार्यक्षेत्र पर ध्यान दिए बिना।