GUIDs के लिए SCOPE_IDENTITY ()?


94

क्या कोई मुझे बता सकता है कि SCOPE_IDENTITY()SQL सर्वर में प्राथमिक कुंजी के रूप में GUID का उपयोग करते समय कोई समतुल्य है ?

मैं पहले GUID बनाना नहीं चाहता और एक चर के रूप में सहेजना चाहता हूं क्योंकि हम अनुक्रमिक GUID का उपयोग हमारी प्राथमिक कुंजी के रूप में कर रहे हैं।

अंतिम सम्मिलित GUID प्राथमिक कुंजी प्राप्त करने का सबसे अच्छा तरीका क्या है, इस पर कोई विचार?

जवाबों:


98

आप OUTPUT का उपयोग करके GUID को वापस पा सकते हैं। यह तब काम करता है जब आप कई रिकॉर्ड भी डाल रहे हैं।

CREATE TABLE dbo.GuidPk (
    ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
    Col2    int              NOT NULL
)
GO

DECLARE @op TABLE (
    ColGuid uniqueidentifier
)

INSERT INTO dbo.GuidPk (
    Col2
)
OUTPUT inserted.ColGuid
INTO @op
VALUES (1)

SELECT * FROM @op

SELECT * FROM dbo.GuidPk

संदर्भ: एसक्यूएल 2005 के ऑउटआउट क्लॉज़ की खोज


2
अनिशमरोकी उल्लेख के अनुसार, आपको अपने GUID को उत्पन्न करने के लिए NewSequentialID () का उपयोग करना चाहिए न कि NewID ()।
रोब गैरीसन

@RobGarrison Imo, PK के रूप में GUID केवल वितरित सिस्टम में int / bigint पर वास्तव में फायदेमंद है। यदि आप एक ID प्राप्त करने के लिए DB को मार रहे हैं, तो आप int / bigint का उपयोग कर सकते हैं। NewSequentialID () का उपयोग केवल डिफ़ॉल्ट बाधा के रूप में किया जा सकता है (उदाहरण के लिए आप NewSequentialID () का उपयोग करके स्पष्ट रूप से सम्मिलित नहीं कर सकते हैं)। जैसे, मुझे लगता है कि अधिकांश परिदृश्य ऐसे हैं जहां आप इसका उपयोग कर सकते हैं, आपको वैसे भी अलग तरह से काम करना चाहिए।
शिव

OUTPUTखंड एक डालने संलग्न ट्रिगर है कि किसी भी मेज पर एक त्रुटि देता है।
कोबस क्रूगर

60

प्राथमिक कुंजी के रूप में GUID का उपयोग करते समय कोई SCOPE_IDENTITY () समतुल्य नहीं है, लेकिन आप समान परिणाम प्राप्त करने के लिए OUTPUT क्लॉज का उपयोग कर सकते हैं। आपको आउटपुट के लिए तालिका चर का उपयोग करने की आवश्यकता नहीं है।

CREATE TABLE dbo.GuidTest (
    GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
    IntColumn int NOT NULL
)

GO

INSERT INTO GuidTest(IntColumn)
OUTPUT inserted.GuidColumn
VALUES(1)

यदि आप एक .Net क्लाइंट से मान पढ़ना चाहते हैं तो ऊपर दिया गया उदाहरण उपयोगी है। .Net से मान को पढ़ने के लिए आप बस ExecuteScalar विधि का उपयोग करेंगे।

...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...

9

आप NEWID का उपयोग करना चाहते हैं ()

    declare @id uniqueidentifier
    set @id  = NEWID()
    INSERT INTO [dbo].[tbl1]
           ([id])
     VALUES
           (@id)

    select @id

लेकिन GUID में अनुक्रमणिका अनुक्रमणिका समस्या है। इसे भी पढ़ें NEWSEQUENTIALID () । ये मेरे विचार हैं, प्राथमिक कुंजी के रूप में GUID का उपयोग करने से पहले सोचें । :)


10
"नया परिणामी () बिल्ट-इन फ़ंक्शन का उपयोग केवल CREATE TABLE या ALTER TABLE स्टेटमेंट में टाइप 'यूनिकफिडिफायर' के कॉलम के लिए DEFAULT एक्सप्रेशन में किया जा सकता है। इसे अन्य ऑपरेटर्स के साथ मिलकर एक जटिल ऑल्टरनेटिव एक्सप्रेशन नहीं बनाया जा सकता है।"
स्कॉट व्हिटलॉक

4
CREATE TABLE TestTable(KEY uniqueidentifier, ID VARCHAR(100), Name VARCHAR(100), Value tinyint);
Declare @id uniqueidentifier ;  
DECLARE @TmpTable TABLE (KEY uniqueidentifier);     
INSERT INTO [dbo].[TestTable]
    ([ID], [Name], Value])           
    OUTPUT INSERTED.KEY INTO @TmpTable           
    VALUES(@ID, @Name, @Value);           
SELECT @uniqueidentifier = KEY FROM @TmpTable; 
DROP TABLE TestTable;

2

इस धागे को संसाधन के रूप में उपयोग करते हुए, मैंने ट्रिगर के भीतर उपयोग के लिए निम्नलिखित बनाया:

DECLARE @nextId uniqueIdentifier;
DECLARE @tempTable TABLE(theKey uniqueIdentifier NOT NULL DEFAULT NewSequentialID(), b int);
INSERT INTO @tempTable (b) Values(@b);
SELECT @nextId = theKey from @tempTable;

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


प्रश्न को फिर से पढ़ने के बाद, मुझे एहसास हुआ कि यह वास्तव में उपयोगकर्ताओं के सवाल का जवाब नहीं देता है ... लेकिन फिर भी किसी के लिए उपयोगी हो सकता है क्योंकि इसी तरह के उत्तर उसी प्रकार की प्रतिक्रिया हैं।
ट्रैविसड्यूड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.