SQL Server GUID的作用域标识符()?

kg7wmglp  于 2023-01-12  发布在  其他
关注(0)|答案(5)|浏览(157)

有谁能告诉我,当在SQL Server中使用GUID作为主键时,是否有SCOPE_IDENTITY()的等效项?
我不想先创建GUID然后保存为变量,因为我们使用连续的GUID作为主键。
您知道检索最后插入的GUID主键的最佳方法是什么吗?

ulmd4ohb

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

piwo6bdm

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();
...
dfddblmv

dfddblmv3#

要使用NEWID()

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

    select @id

但是聚集索引问题存在于GUID中。也读这个NEWSEQUENTIALID()。这些是我的想法,在使用GUID作为primary Key之前要考虑一下。:)

mklgxw1f

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;
a11xaf1n

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;

可能会帮助别人做同样的事情。好奇如果有人有什么不好的话要说,性能明智,如果这不是一个好主意或不。

相关问题