Sql GUID的作用域\标识()?
有谁能告诉我,在SQL Server中使用GUID作为主键时,是否存在与Sql GUID的作用域\标识()?,sql,sql-server,guid,uniqueidentifier,scope-identity,Sql,Sql Server,Guid,Uniqueidentifier,Scope Identity,有谁能告诉我,在SQL Server中使用GUID作为主键时,是否存在与SCOPE\u IDENTITY()等效的属性 我不想先创建GUID并另存为变量,因为我们使用顺序GUID作为主键 您知道检索上次插入的GUID主键的最佳方式吗?您想使用NEWID()吗 但GUID中存在聚集索引问题。也请阅读这篇文章。这些是我的想法,请在使用GUID之前先思考。:) 您可以使用输出返回GUID。当您插入多个记录时,此功能也会起作用 CREATE TABLE dbo.GuidPk ( ColGuid
SCOPE\u IDENTITY()
等效的属性
我不想先创建GUID并另存为变量,因为我们使用顺序GUID作为主键
您知道检索上次插入的GUID主键的最佳方式吗?您想使用NEWID()吗
但GUID中存在聚集索引问题。也请阅读这篇文章。这些是我的想法,请在使用GUID之前先思考。:) 您可以使用输出返回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
参考:当使用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();
...
使用此线程作为资源,我创建了以下用于触发器的线程:
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;
可能会帮助其他人做同样的事情。好奇是否有人在性能方面有什么不好的地方,如果这不是一个好主意或不是 正如anishmarokey提到的,您应该使用NewSequentialID()来生成您的GUID,而不是NewID()。@RobGarrison Imo,GUID作为PK在分布式系统中只比int/bigint更具优势。如果要点击DB获取ID,那么最好使用int/bigint。NewSequentialID()只能用作默认约束(例如,不能使用NewSequentialID()显式插入)。因此,我认为绝大多数可以使用它的情况下,无论如何都应该以不同的方式进行操作。
OUTPUT
子句在任何附加了insert触发器的表上都会给出一个错误内置函数只能用于CREATE TABLE或ALTER TABLE语句中“uniqueidentifier”类型列的默认表达式中。它不能与其他运算符组合以形成复杂的标量表达式。“重新阅读问题后,我意识到这确实不能回答用户的问题。。。但仍然可能对某人有所帮助,因为相似的答案是相同类型的回答。
...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...
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;