SCOPE_IDENTITY()为GUID?

任何人都可以告诉我,如果有相当于SCOPE_IDENTITY()使用GUIDs作为SQL Server中的主键?

我不想首先创buildGUID并保存为variables,因为我们使用顺序的GUID作为主键。

任何想法什么是最好的方法来检索最后插入的GUID主键?

您可以通过使用OUTPUT获取GUID。 这也适用于你插入多个logging。

 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子句获得类似的结果。 您不需要使用表格variables来输出。

 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; 

使用这个线程作为资源,我创build了以下在触发器中使用:

 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; 

可以帮助别人做同样的事情。 好奇,如果任何人有什么不好的performance明智,如果这不是一个好主意或不。