GUID的SCOPE_IDENTITY()?

bpl*_*lus 92 sql sql-server guid uniqueidentifier scope-identity

任何人都能告诉我是否有相当于SCOPE_IDENTITY()在SQL Server中使用GUID作为主键的时候?

我不想先创建GUID并保存为变量,因为我们使用顺序GUID作为主键.

有什么最好的方法来检索最后插入的GUID主键吗?

Rob*_*son 96

您可以使用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
Run Code Online (Sandbox Code Playgroud)

参考:探索SQL 2005的OUTPUT子句

  • 正如anishmarokey所提到的,您应该使用NewSequentialID()来生成GUID而不是NewID(). (2认同)

Dan*_*iel 59

使用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)
Run Code Online (Sandbox Code Playgroud)

如果要从.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();
...
Run Code Online (Sandbox Code Playgroud)


ani*_*key 8

你想使用NEWID()

    declare @id uniqueidentifier
    set @id  = NEWID()
    INSERT INTO [dbo].[tbl1]
           ([id])
     VALUES
           (@id)

    select @id
Run Code Online (Sandbox Code Playgroud)

但GUID中存在聚簇索引问题.另读这个NEWSEQUENTIALID().这些是我的想法,在使用GUID作为主键之前要考虑.:)

  • "newsequentialid()内置函数只能在CREATE TABLE或ALTER TABLE语句中的'uniqueidentifier'类型的列的DEFAULT表达式中使用.它不能与其他运算符组合以形成复杂的标量表达式." (9认同)