SCOPE_IDENTITY () สำหรับ GUID หรือไม่


94

ใครช่วยบอกฉันได้ไหมว่าSCOPE_IDENTITY()เมื่อใช้ GUID เป็นคีย์หลักใน SQL Server มีความเท่าเทียมกันหรือไม่

ฉันไม่ต้องการสร้าง GUID ก่อนและบันทึกเป็นตัวแปรเนื่องจากเราใช้ GUID ตามลำดับเป็นคีย์หลักของเรา

มีความคิดเห็นเกี่ยวกับวิธีใดที่ดีที่สุดในการดึงคีย์หลัก GUID ที่แทรกล่าสุด

คำตอบ:


101

คุณสามารถรับ GUID กลับคืนมาได้โดยใช้ OUTPUT วิธีนี้ใช้ได้ผลเมื่อคุณแทรกหลายระเบียนด้วย

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

การอ้างอิง: การสำรวจ OUTPUT Clause ของ SQL 2005


2
ตามที่ anishmarokey กล่าวถึงคุณควรใช้ NewSequentialID () เพื่อสร้าง GUID ของคุณไม่ใช่ NewID ()
Rob Garrison

1
@RobGarrison Imo, GUID ในฐานะ PK นั้นมีประโยชน์มากกว่า int / bigint ในระบบกระจายเท่านั้น หากคุณกดปุ่ม DB เพื่อดึง ID คุณอาจใช้ int / bigint ได้เช่นกัน NewSequentialID () สามารถใช้เป็นข้อ จำกัด เริ่มต้นเท่านั้น (ตัวอย่างเช่นคุณไม่สามารถแทรกโดยใช้ NewSequentialID () ได้อย่างชัดเจน) ด้วยเหตุนี้ฉันคิดว่าสถานการณ์ส่วนใหญ่ที่คุณสามารถใช้มันได้คุณควรจะทำสิ่งต่างๆที่แตกต่างออกไปอยู่ดี
Shiv

OUTPUTประโยคให้ข้อผิดพลาดใด ๆ บนโต๊ะที่มีทริกเกอร์แทรกที่แนบมา
Cobus Kruger

62

ไม่มี SCOPE_IDENTITY () เทียบเท่าเมื่อใช้ GUID เป็นคีย์หลัก แต่คุณสามารถใช้คำสั่ง 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
"ฟังก์ชันในตัว newsequentialid () สามารถใช้ได้เฉพาะในนิพจน์ DEFAULT สำหรับคอลัมน์ประเภท 'uniqueidentifier' ในคำสั่ง CREATE TABLE หรือ ALTER TABLE ไม่สามารถใช้ร่วมกับตัวดำเนินการอื่นเพื่อสร้างนิพจน์สเกลาร์ที่ซับซ้อนได้"
Scott Whitlock

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;

อาจช่วยคนอื่นทำสิ่งเดียวกัน อยากรู้ว่าใครมีอะไรไม่ดีที่จะพูดถึงประสิทธิภาพที่ชาญฉลาดหากนี่ไม่ใช่ความคิดที่ดีหรือไม่


หลังจากอ่านคำถามซ้ำฉันตระหนักว่าสิ่งนี้ไม่ได้ตอบคำถามของผู้ใช้จริงๆ ... แต่ก็ยังอาจเป็นประโยชน์กับใครบางคนเพราะคำตอบที่คล้ายกันเป็นการตอบสนองประเภทเดียวกัน
TravisWhidden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.