8

我讀過this question獲取插入行的身份。我的問題是有關聯的。獲取插入行的PK Guid的最佳方式

有沒有辦法讓插入的行的GUID?我正在使用的表具有作爲主鍵的guid(默認爲newid),並且我想在插入行後檢索該guid。

對於Guids有沒有類似@@IDENTITY,IDENT_CURRENTSCOPE_IDENTITY

回答

12

您可以使用OUTPUT功能將缺省值返回給參數。

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @myNewPKTable TABLE (myNewPK UNIQUEIDENTIFIER) 

INSERT INTO 
    MyTable 
(
    MyColumn1, 
    MyColumn2 
) 
OUTPUT INSERTED.MyPK INTO @myNewPKTable 
VALUES 
(
    'MyValue1', 
    'MyValue2' 
) 

SELECT * FROM @myNewPKTable 

我不得不說,但要小心使用唯一標識符作爲主鍵。對GUID進行索引的性能非常差,因爲任何新生成的GUID都必須插入到索引的中間,並且只是最後添加。 SQL2005中爲NewSequentialId()提供了新功能。如果你的Guids不需要默默無聞,那麼它是一個可能的選擇。

+0

您好,感謝您的意見。此代碼返回錯誤「必須聲明表變量」@myNewPK「」。看來你只能輸出到一個表格中。我已經通過聲明一個臨時表然後從表中選擇ID來工作。感謝您的幫助,並就Guids的糟糕表現提供建議。 – 2009-05-01 10:27:15

1

另一種更簡潔的方法,如果插入單行

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @MyID UNIQUEIDENTIFIER; 
SET @MyID = NEWID(); 

INSERT INTO 
    MyTable 
(
    MyPK 
    MyColumn1, 
    MyColumn2 
) 
VALUES 
(
    @MyID, 
    'MyValue1', 
    'MyValue2' 
) 

SELECT @MyID;