Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में IDENT_CURRENT बनाम @@ पहचान बनाम SCOPE_IDENTITY:क्या अंतर है?

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() दूसरी ओर, पिछले उदाहरण के समान ही परिणाम देता है, क्योंकि इसके परिणाम निर्दिष्ट तालिका पर आधारित होते हैं, सत्र या कार्यक्षेत्र पर ध्यान दिए बिना।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर डेटाबेस में डेटा खोए बिना सीडीसी सक्षम तालिका से कॉलम कैसे जोड़ें या छोड़ें - SQL सर्वर ट्यूटोरियल

  2. आशावादी बनाम निराशावादी लॉकिंग

  3. बिटवाइज़-या एक सबक्वेरी में एकत्रित करें

  4. पहले से मौजूद तालिका के लिए कॉलम पर अद्वितीय बाधा कैसे बनाएं - SQL सर्वर / TSQL ट्यूटोरियल भाग 97

  5. SP_dbcmptlevel पदावनत होने के बाद SQL सर्वर डेटाबेस संगतता की जाँच कैसे करें?