8

Przeczytałem this question o otrzymaniu tożsamości wstawionego wiersza. Moje pytanie jest trochę powiązane.Najlepszy sposób uzyskania PK Guid wstawionego wiersza

Czy istnieje sposób na pobranie identyfikatora dla wstawionego wiersza? Tabela, z którą pracuję ma guid jako klucz podstawowy (domyślnie jest to newid) i chciałbym pobrać ten Guid po wstawieniu wiersza.

Czy istnieje coś takiego jak @@IDENTITY, IDENT_CURRENT lub SCOPE_IDENTITY dla Guids?

Odpowiedz

12

Możesz użyć funkcji WYJŚCIA, aby przywrócić domyślne wartości z powrotem do parametru.

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @myNewPKTable TABLE (myNewPK UNIQUEIDENTIFIER) 

INSERT INTO 
    MyTable 
(
    MyColumn1, 
    MyColumn2 
) 
OUTPUT INSERTED.MyPK INTO @myNewPKTable 
VALUES 
(
    'MyValue1', 
    'MyValue2' 
) 

SELECT * FROM @myNewPKTable 

Muszę jednak zachować ostrożność, używając unikalnego identyfikatora jako klucza podstawowego. Indeksowanie GUID jest bardzo słabą wydajnością, ponieważ wszystkie nowo wygenerowane guidy będą musiały zostać wstawione do środka indeksu i rużnie dodane po prostu na końcu. W SQL2005 dostępna jest nowa funkcjonalność dla NewSequentialId(). Jeśli pomijanie nie jest wymagane w przypadku twoich Guidów, to jest to możliwe.

+0

cześć, dzięki za radę. Ten kod zwraca błąd "Należy zadeklarować zmienną tabeli" @myNewPK "". Wygląda na to, że możesz tylko wyprowadzać dane do tabeli. Mam to działa, deklarując tabelę tymczasową, a następnie wybierając identyfikator ze stołu. Dziękuję za twoją pomoc i radę na kiepską skuteczność Guids. –

+0

Przepraszam, nie testowałem tego, po prostu wyrzuciłem to z tego, co zapamiętałem. Zaktualizowałem teraz odpowiedź, zwracając zmienną tabeli. –

+0

Bardzo ładnie, dziękuję Robin. Zaakceptowany :) –

1

Innym czystsze podejście, jeśli wkładając jeden wiersz

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @MyID UNIQUEIDENTIFIER; 
SET @MyID = NEWID(); 

INSERT INTO 
    MyTable 
(
    MyPK 
    MyColumn1, 
    MyColumn2 
) 
VALUES 
(
    @MyID, 
    'MyValue1', 
    'MyValue2' 
) 

SELECT @MyID; 
Powiązane problemy