插入行的主键GUID获取的最佳方法

11

我读了关于获取插入行标识的这个问题。我的问题有点相关。

是否有一种方法可以获取插入行的GUID?我正在处理的表使用GUID作为主键(默认为newid),我想在插入行后检索该GUID。

@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY这样的获取GUID的方法吗?

2个回答

16

您可以使用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() 的新功能。如果您的 GUID 不需要保密,则这是一个可能的替代方案。


嗨,感谢您的建议。这段代码返回一个错误“必须声明表变量“@myNewPK””。看起来你只能输出到一个表中。我通过声明一个临时表并从表中选择id来使其工作。感谢您的帮助,并提供有关Guid性能不佳的建议。 - Doctor Jones
抱歉,我没有测试过它,只是根据我记得的东西将其组合在一起。现在已经更新了答案,并返回一个表变量。 - Robin Day
2
不确定为什么您在不先进入临时表的情况下难以简单地选择插入的值... "INSERT INTO Table (Fields) OUTPUT INSERTED.* VALUES (FieldValues)" 对我来说完美无缺。SQL Server 10.0.1600。 - Michael Bray
我认为@MichaelBray有一点道理; 与此处看到的相同(“不需要单独的SELECT…”)。还请注意,获取一个插入行的单个GUID(ExecuteScalar)或在同一时间插入多个行的多个GUID(ExecuteReader)之间的区别如此处所示 - Nate Anderson

3
如果只需要插入单行数据,则另一种更简洁的方法如下:
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接