有谁能告诉我,当在SQL Server中使用GUID作为主键时,是否有SCOPE_IDENTITY()的等效项?我不想先创建GUID然后保存为变量,因为我们使用连续的GUID作为主键。您知道检索最后插入的GUID主键的最佳方法是什么吗?
SCOPE_IDENTITY()
ulmd4ohb1#
你可以通过使用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
参考:Exploring SQL 2005’s OUTPUT Clause
piwo6bdm2#
当使用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(); ...
dfddblmv3#
要使用NEWID()
declare @id uniqueidentifier set @id = NEWID() INSERT INTO [dbo].[tbl1] ([id]) VALUES (@id) select @id
但是聚集索引问题存在于GUID中。也读这个NEWSEQUENTIALID()。这些是我的想法,在使用GUID作为primary Key之前要考虑一下。:)
mklgxw1f4#
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;
a11xaf1n5#
使用此线程作为资源,我创建了以下代码以在触发器中使用:
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;
可能会帮助别人做同样的事情。好奇如果有人有什么不好的话要说,性能明智,如果这不是一个好主意或不。
5条答案
按热度按时间ulmd4ohb1#
你可以通过使用OUTPUT来取回GUID。当你插入多条记录时也可以这样做。
参考:Exploring SQL 2005’s OUTPUT Clause
piwo6bdm2#
当使用GUID作为主键时,没有等效的SCOPE_IDENTITY(),但是您可以使用OUTPUT子句来实现类似的结果。您不需要使用表变量来输出。
如果要从.Net客户端读取值,上面的示例非常有用。要从.Net读取值,只需使用ExecuteScalar方法。
dfddblmv3#
要使用NEWID()
但是聚集索引问题存在于GUID中。也读这个NEWSEQUENTIALID()。这些是我的想法,在使用GUID作为primary Key之前要考虑一下。:)
mklgxw1f4#
a11xaf1n5#
使用此线程作为资源,我创建了以下代码以在触发器中使用:
可能会帮助别人做同样的事情。好奇如果有人有什么不好的话要说,性能明智,如果这不是一个好主意或不。