SQL सर्वर में, आप T-SQL का उपयोग कर सकते हैं SCOPE_IDENTITY()
एक ही दायरे में एक पहचान कॉलम में डाले गए अंतिम पहचान मान को वापस करने के लिए कार्य करता है।
एक दायरा एक मॉड्यूल (संग्रहीत प्रक्रिया, ट्रिगर, फ़ंक्शन, या बैच) है। यदि दो कथन एक ही संग्रहीत कार्यविधि, कार्य या बैच में हैं, तो वे एक ही दायरे में हैं।
ध्यान दें कि यह मौजूदा सत्र में किसी भी तालिका में जेनरेट किया गया अंतिम पहचान मान लौटाता है . यह IDENT_CURRENT()
. के विपरीत है फ़ंक्शन, जो अंतिम सम्मिलित पहचान मान किसी तालिका के लिए . देता है , चाहे वह किसी भी सत्र में हो।
SCOPE_IDENTITY()
@@IDENTITY
. से बहुत मिलता-जुलता है इसमें वे दोनों वर्तमान सत्र में अंतिम-सम्मिलित पहचान मान लौटाते हैं। अंतर यह है कि SCOPE_IDENTITY()
वर्तमान दायरे तक सीमित है, जबकि @@IDENTITY
एक विशिष्ट दायरे तक सीमित नहीं है।
उदाहरण 1 - मूल उपयोग
यह कैसे काम करता है इसका एक बुनियादी कोड उदाहरण यहां दिया गया है।
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
NULL परिणाम का कारण यह है कि मैंने SQL सर्वर से नया कनेक्शन खोलने के तुरंत बाद स्टेटमेंट चलाया। SCOPE_IDENTITY()
फ़ंक्शन केवल वर्तमान सत्र से परिणाम देता है।
तो एक गैर-शून्य परिणाम प्राप्त करने के लिए, मुझे एक पहचान कॉलम में एक मान डालना होगा।
उदाहरण 2 - एक गैर-शून्य परिणाम के लिए एक मान डालें
इस उदाहरण में, मैं एक पहचान स्तंभ के साथ एक तालिका बनाता हूं। मैं तब तालिका की सामग्री का चयन करने और फिर SCOPE_IDENTITY()
चलाने से पहले उस तालिका में एक डिफ़ॉल्ट मान सम्मिलित करता हूं फिर से।
CREATE TABLE scope_identity_test(id int IDENTITY(1,1)); INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+------+ | id | |------| | 1 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+ (1 row affected)
तालिका में एक पंक्ति है और इसके पहचान स्तंभ का मान 1 है। यह वर्तमान सत्र के लिए अंतिम बार डाला गया पहचान मान है, और इसलिए SCOPE_IDENTITY()
1 भी लौटाता है।
अब अगर मैं एक और पंक्ति जोड़ता हूं, तो मान तदनुसार बढ़ता है:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
नए सत्र के परिणाम
जैसा कि बताया गया है, SCOPE_IDENTITY()
केवल उसी सत्र से परिणाम लौटाता है। यह @@IDENTITY
. के बारे में भी सच है ।
इसलिए यदि मैं SQL सर्वर से एक नया कनेक्शन खोलता हूं और पिछला SELECT
चलाता हूं बयान फिर से, मुझे निम्नलिखित परिणाम मिलते हैं:
USE Test; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+ (1 row affected)
आइए अब इस नए सत्र में एक नई पंक्ति डालें:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 3 | +--------------------------------+ (3 rows affected)
इसलिए जैसे ही मैंने एक नया पहचान मूल्य डाला, यह पकड़ में आ गया।
हालांकि, आइए मूल सत्र पर वापस जाएं और SELECT
चलाएं फिर से बयान (एक नई पंक्ति सम्मिलित किए बिना):
SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
परिणाम:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (3 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
तो मूल सत्र का SCOPE_IDENTITY()
दूसरे सत्र से परिणाम प्रभावित नहीं हुए हैं।
दूसरा दायरा जोड़ना
वह चीज़ जो SCOPE_IDENTITY()
में अंतर करती है @@IDENTITY
. से , क्या वह SCOPE_IDENTITY()
है वर्तमान दायरे तक सीमित है।
उदाहरण के लिए, यदि तालिका में एक ट्रिगर है जो किसी अन्य तालिका में एक पहचान मान सम्मिलित करता है, SCOPE_IDENTITY()
केवल पहले पहचान मूल्य की रिपोर्ट करेगा। यह दूसरी तालिका के लिए पहचान मान को अनदेखा कर देगा, क्योंकि यह एक अलग दायरे में बनाया गया था @@IDENTITY
दूसरी ओर, दूसरी तालिका के लिए पहचान मूल्य की रिपोर्ट करेगा (क्योंकि इसमें सभी क्षेत्र शामिल हैं)।
मेरे मतलब के उदाहरण के लिए, SQL सर्वर में IDENT_CURRENT बनाम @@ IDENTITY बनाम SCOPE_IDENTITY देखें:क्या अंतर है?
वह लेख एक ट्रिगर उदाहरण के माध्यम से चलता है जैसे मैं यहाँ किस बारे में बात कर रहा हूँ।