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;