当使用GUID作为SQL Server中的主键时,是否有类似于SCOPE_IDENTITY()
的等效方法?
由于我们正在使用顺序GUID作为我们的主键,因此不想先创建GUID并保存为变量。
有什么最好的方法来检索最后插入的GUID主键吗?
当使用GUID作为SQL Server中的主键时,是否有类似于SCOPE_IDENTITY()
的等效方法?
由于我们正在使用顺序GUID作为我们的主键,因此不想先创建GUID并保存为变量。
有什么最好的方法来检索最后插入的GUID主键吗?
你可以使用 OUTPUT 来获取 GUID,在插入多条记录时同样适用。
CREATE TABLE dbo.GuidPk (
ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
Col2 int NOT NULL
)
GO
DECLARE @op TABLE (
ColGuid uniqueidentifier
)
INSERT INTO dbo.GuidPk (
Col2
)
OUTPUT inserted.ColGuid
INTO @op
VALUES (1)
SELECT * FROM @op
SELECT * FROM dbo.GuidPk
参考资料: 了解SQL 2005的OUTPUT子句
使用GUID作为主键时,没有像SCOPE_IDENTITY()一样的等效函数,但您可以使用OUTPUT子句来实现类似的结果。您不需要使用表变量进行输出。
CREATE TABLE dbo.GuidTest (
GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
IntColumn int NOT NULL
)
GO
INSERT INTO GuidTest(IntColumn)
OUTPUT inserted.GuidColumn
VALUES(1)
如果您想从.Net客户端读取值,上面的示例很有用。要从.Net读取值,只需使用ExecuteScalar方法即可。
...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...
您想使用NEWID()函数
declare @id uniqueidentifier
set @id = NEWID()
INSERT INTO [dbo].[tbl1]
([id])
VALUES
(@id)
select @id
但是 GUID 在群集索引方面存在问题。请阅读此文章 NEWSEQUENTIALID()。这是我的想法,请在将 GUID 用作主键之前进行思考。 :)
CREATE TABLE TestTable(KEY uniqueidentifier, ID VARCHAR(100), Name VARCHAR(100), Value tinyint);
Declare @id uniqueidentifier ;
DECLARE @TmpTable TABLE (KEY uniqueidentifier);
INSERT INTO [dbo].[TestTable]
([ID], [Name], Value])
OUTPUT INSERTED.KEY INTO @TmpTable
VALUES(@ID, @Name, @Value);
SELECT @uniqueidentifier = KEY FROM @TmpTable;
DROP TABLE TestTable;
使用这个帖子作为资源,我创建了以下内容以在触发器内使用:
DECLARE @nextId uniqueIdentifier;
DECLARE @tempTable TABLE(theKey uniqueIdentifier NOT NULL DEFAULT NewSequentialID(), b int);
INSERT INTO @tempTable (b) Values(@b);
SELECT @nextId = theKey from @tempTable;
这可能会帮助其他做同样事情的人。如果这不是一个好主意,或者有任何性能方面的不良影响,是否有人有任何负面评论?
OUTPUT
子句会在任何附有插入触发器的表上产生错误。 - Cobus Kruger