Oprócz wydajności wszystkie mają raczej różne znaczenia.
SCOPE_IDENTITY()
poda ostatnią wartość tożsamości wstawioną do dowolnej tabeli bezpośrednio w bieżącym zakresie (zakres = partia, procedura składowana itp., ale nie w ramach, powiedzmy, wyzwalacza uruchomionego przez bieżący zakres).
IDENT_CURRENT()
poda ostatnią wartość tożsamości wstawioną do określonej tabeli z dowolnego zakresu przez dowolnego użytkownika.
@@IDENTITY
daje ostatnią wartość tożsamości wygenerowaną przez najnowszą instrukcję INSERT dla bieżącego połączenia, niezależnie od tabeli lub zakresu. (Uwaga dodatkowa: Access korzysta z tej funkcji, a zatem ma pewne problemy z wyzwalaczami, które wstawiają wartości do tabel z kolumnami tożsamości).
Użycie MAX()
lub TOP 1
może dać całkowicie błędne wyniki, jeśli tabela ma negatywny krok identyczności lub w wierszu wstawiono wiersze SET IDENTITY_INSERT
. Oto skrypt demonstrujący wszystkie te:
CREATE TABLE ReverseIdent (
id int IDENTITY(9000,-1) NOT NULL PRIMARY KEY CLUSTERED,
data char(4)
)
INSERT INTO ReverseIdent (data)
VALUES ('a'), ('b'), ('c')
SELECT * FROM ReverseIdent
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9000
SET IDENTITY_INSERT ReverseIdent ON
INSERT INTO ReverseIdent (id, data)
VALUES (9005, 'd')
SET IDENTITY_INSERT ReverseIdent OFF
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9005
Podsumowanie: kij z SCOPE_IDENTITY()
, IDENT_CURRENT()
lub @@IDENTITY
, i upewnij się, że używasz ten, który powraca co rzeczywiście potrzebne.