Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql GUID的作用域\标识()?_Sql_Sql Server_Guid_Uniqueidentifier_Scope Identity - Fatal编程技术网

Sql 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

有谁能告诉我,在SQL Server中使用GUID作为主键时,是否存在与
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;