জিইউইডগুলির জন্য SCOPE_IDENTITY ()?


94

SCOPE_IDENTITY()এসকিউএল সার্ভারে প্রাথমিক কী হিসাবে জিইউইডি ব্যবহার করার সময় এর সমতুল্যতা আছে কি কেউ আমাকে বলতে পারবে ?

আমি প্রথমে জিইউডি তৈরি করতে এবং ভেরিয়েবল হিসাবে সংরক্ষণ করতে চাই না কারণ আমরা আমাদের প্রাথমিক কী হিসাবে অনুক্রমিক জিইউইডি ব্যবহার করছি।

সর্বশেষ sertedোকানো জিইউডি প্রাথমিক কী পুনরুদ্ধার করার সর্বোত্তম উপায়টি সম্পর্কে কোনও ধারণা?

উত্তর:


100

আপনি আউটপুট ব্যবহার করে জিইউডি ফিরে পেতে পারেন। আপনি একাধিক রেকর্ড সন্নিবেশ করানোর সময় এটি কাজ করে।

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 এর আউটপুট ক্লজটি অন্বেষণ করা


4
অ্যানিশমারকি যেমন উল্লেখ করেছেন, আপনার জিইউডিগুলি তৈরি করতে নিউএসইউকেনশিয়ালআইডি () ব্যবহার করা উচিত, নিউআইডি () নয়।
রব গ্যারিসন

4
@ রবারগ্যারিসন ইমো, একজন পিকে হিসাবে জিইউইডি বিতরণ সিস্টেমে কেবল ইনট / বিগিন্টের চেয়ে বেশি সুবিধাজনক। আপনি যদি আইডি আনার জন্য ডিবিটিকে হিট করছেন তবে আপনি ইন্ট / বিগিন্টটিও ব্যবহার করতে পারেন। নিউসেকুয়েন্সিয়ালআইডি () কেবলমাত্র একটি ডিফল্ট সীমাবদ্ধতা হিসাবে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ আপনি নিউসেকেন্ডিয়ালআইডি () ব্যবহার করে স্পষ্টভাবে সন্নিবেশ করতে পারবেন না)। এই হিসাবে, আমি মনে করি যে আপনি যেখানে এটি ব্যবহার করতে পারেন সেখানে বেশিরভাগ পরিস্থিতিতে আপনার কাজগুলি অন্যভাবে করা উচিত।
শিব

OUTPUTদফা একটি সন্নিবেশ সংযুক্ত ট্রিগার যে কোনো টেবিলের উপর একটি ত্রুটি দেয়।
কোবাস ক্রুগার

62

জিআইডিগুলিকে প্রাথমিক কী হিসাবে ব্যবহার করার সময় কোনও 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 থেকে মানটি পড়তে আপনি এখন কেবল এক্সিকিউটসকালার পদ্ধতিটি ব্যবহার করবেন।

...
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

তবে ক্লাস্টারড ইনডেক্সের সমস্যা জিইউইডিতে রয়েছে। এটি একটি খুব পড়ুন NEWSEQUENTIALID ()। এগুলি আমার ধারণাগুলি, প্রাথমিক কী হিসাবে জিইউইডি ব্যবহার করার আগে ভাবেন । :)


10
"নতুন সম্ভাব্য () অন্তর্নির্মিত ফাংশনটি কেবল 'ক্রেইট টেবিল বা অলটার টেবিলে বিবৃতিতে টাইপ' অনন্য পরিচয়কারী 'এর কলামের জন্য একটি ডিফল্ট এক্সপ্রেশন হিসাবে ব্যবহার করা যেতে পারে other জটিল স্কেলার এক্সপ্রেশন গঠনের জন্য এটি অন্যান্য অপারেটরদের সাথে একত্রিত করা যায় না।"
স্কট হুইটলক

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;

অন্য কাউকে একই জিনিস করতে সহায়তা করতে পারে। কারও কাছে পারফরম্যান্স ওয়াইজ বলার খারাপ কিছু থাকলে কৌতুহল, এটি যদি ভাল ধারণা না হয় তবে না।


প্রশ্নটি পুনরায় পড়ার পরে, আমি বুঝতে পেরেছি এটি সত্যই ব্যবহারকারীদের প্রশ্নের উত্তর দেয় না ... তবে এখনও কারও পক্ষে সহায়ক হতে পারে কারণ অনুরূপ উত্তরগুলি একই ধরণের প্রতিক্রিয়া।
ট্র্যাভিসওয়াইডেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.