SCOPE_IDENTITY() для GUID?

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

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

Любая идея о том, какой лучший способ получить последний вставленный первичный ключ GUID?

Ответ 1

Вы можете вернуть 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

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

Ответ 2

Нет эквивалента 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();
...

Ответ 3

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

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

    select @id

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

Ответ 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;

Ответ 5

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

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;

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