100

谁能告诉我SCOPE_IDENTITY()在 SQL Server 中使用 GUID 作为主键时是否存在等效的情况?

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

关于检索最后插入的 GUID 主键的最佳方法的任何想法?

4

5 回答 5

103

您可以使用 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

参考:探索 SQL 2005 的 OUTPUT 子句

于 2009-10-02T16:15:37.033 回答
65

使用 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();
...
于 2011-12-06T10:11:22.883 回答
10

你想使用 NEWID()

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

    select @id

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

于 2009-10-02T15:30:56.360 回答
4
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;
于 2011-07-27T08:57:50.030 回答
2

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

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;

可能会帮助其他人做同样的事情。好奇如果这不是一个好主意,是否有人有什么不好的说法。

于 2013-12-31T23:50:23.330 回答