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.
@@IDENTITYdaje 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 1moż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.