SCOPE_IDENTITY () для идентификаторов GUID? - PullRequest
89 голосов
/ 02 октября 2009

Может кто-нибудь сказать мне, есть ли эквивалент SCOPE_IDENTITY() при использовании GUID в качестве первичного ключа в SQL Server?

Я не хочу сначала создавать GUID и сохранять его как переменную, поскольку мы используем последовательные GUID в качестве наших первичных ключей.

Есть идеи, как лучше всего получить последний вставленный первичный ключ GUID?

Ответы [ 5 ]

91 голосов
/ 02 октября 2009

Вы можете получить GUID обратно, используя OUTPUT. Это работает, когда вы также вставляете несколько записей.

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

Ссылка: Изучение предложения OUTPUT в SQL 2005

54 голосов
/ 06 декабря 2011

Нет эквивалента SCOPE_IDENTITY () при использовании GUID в качестве первичных ключей, но вы можете использовать предложение 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();
...
7 голосов
/ 02 октября 2009

вы хотите использовать NEWID ()

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

    select @id

но проблема с кластерным индексом есть в GUID. прочтите это тоже NEWSEQUENTIALID () . Это мои идеи, подумайте, прежде чем использовать GUID в качестве первичного ключа . :)

3 голосов
/ 27 июля 2011
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;
1 голос
/ 01 января 2014

Используя этот поток в качестве ресурса, я создал следующее для использования в триггере:

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;

Может помочь кому-нибудь сделать то же самое. Любопытно, если у кого-то есть что-то плохое, чтобы сказать производительность, если это не хорошая идея или нет.

...