Sql server 获取插入行的PK Guid的最佳方法

Sql server 获取插入行的PK Guid的最佳方法,sql-server,sql-server-2005,insert,identity,uniqueidentifier,Sql Server,Sql Server 2005,Insert,Identity,Uniqueidentifier,我读过关于获取插入行的标识的内容。我的问题有点相关 有没有办法获取插入行的guid?我正在使用的表有一个guid作为主键(默认为newid),我希望在插入行后检索该guid guid是否有类似于@@IDENTITY、IDENT\u CURRENT或SCOPE\u IDENTITY的内容?您可以使用输出功能将默认值返回到参数中 CREATE TABLE MyTable ( MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), MyColumn1 NVARCH

我读过关于获取插入行的标识的内容。我的问题有点相关

有没有办法获取插入行的guid?我正在使用的表有一个guid作为主键(默认为newid),我希望在插入行后检索该guid


guid是否有类似于
@@IDENTITY
IDENT\u CURRENT
SCOPE\u IDENTITY
的内容?

您可以使用输出功能将默认值返回到参数中

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()的新功能。如果您的guid不需要晦涩,那么它是一种可能的替代方法。

另一种更干净的方法,如果插入一行

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;

嗨,谢谢你的建议。此代码返回一个错误“必须声明表变量”@myNewPK”。似乎您只能输出到表中。我通过声明一个临时表,然后从表中选择id,使它工作起来。谢谢你的帮助,以及关于Guids糟糕性能的建议。对不起,我没有测试它,只是根据我的记忆把它拼凑起来。现在更新了答案,返回了一个表变量。不知道为什么不先进入临时表而直接选择插入值会有问题。。。“插入表(字段)输出插入。*值(字段值)”非常适合我。SQL Server 10.0.1600。我认为@MichaelBray有道理;(“无需单独选择…”)。还请注意为一个插入行获取单个GUID(
ExecuteScalar
),或为同时插入的多行获取多个GUID(
ExecuteReader
)之间的区别,