我读了关于获取插入行标识的这个问题。我的问题有点相关。
是否有一种方法可以获取插入行的GUID?我正在处理的表使用GUID作为主键(默认为newid),我想在插入行后检索该GUID。
像@@IDENTITY
、IDENT_CURRENT
或SCOPE_IDENTITY
这样的获取GUID的方法吗?
我读了关于获取插入行标识的这个问题。我的问题有点相关。
是否有一种方法可以获取插入行的GUID?我正在处理的表使用GUID作为主键(默认为newid),我想在插入行后检索该GUID。
像@@IDENTITY
、IDENT_CURRENT
或SCOPE_IDENTITY
这样的获取GUID的方法吗?
您可以使用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 不需要保密,则这是一个可能的替代方案。
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;
ExecuteScalar
)或在同一时间插入多个行的多个GUID(ExecuteReader
)之间的区别如此处所示。 - Nate Anderson