W SQL Server możesz użyć T-SQL @@IDENTITY
funkcja systemowa zwracająca ostatnio wprowadzoną wartość tożsamości w bieżącej sesji.
Zwróć uwagę, że zwraca ostatnią wartość tożsamości wygenerowaną w any tabela w bieżącej sesji . Jest to w przeciwieństwie do IDENT_CURRENT()
funkcja, która zwraca ostatnio wstawioną wartość tożsamości dla danej tabeli .
SCOPE_IDENTITY()
funkcja jest bardzo podobna do @@IDENTITY
w tym, że zwraca również ostatnio wstawioną wartość tożsamości w bieżącej sesji. Różnica polega na tym, że SCOPE_IDENTITY()
jest ograniczony do aktualnego zakresu.
Przykład 1
Oto podstawowy przykład kodu @@IDENTITY
wykorzystanie.
SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Wynik:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
Powód, dla którego zwraca NULL
to dlatego, że otworzyłem nową sesję na serwerze SQL Server i nie zaktualizowałem jeszcze kolumny tożsamości podczas bieżącej sesji.
Poniżej znajduje się kod, który dokonuje aktualizacji niektórych kolumn tożsamości.
CREATE TABLE Cats(id int IDENTITY); CREATE TABLE Dogs(id int IDENTITY); INSERT Cats DEFAULT VALUES; INSERT Cats DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Wynik:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+
Tutaj tworzę kilka tabel, wstawiam trochę danych, a następnie wybieram bieżącą wartość tożsamości.
Obecna wartość tożsamości to 2, ponieważ wstawiłem dwa wiersze do tej tabeli.
Teraz wstawmy jeden wiersz do drugiej tabeli:
INSERT Dogs DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
Wynik:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+
Zwrócona wartość to 1, ponieważ jest to ostatnia wstawiona wartość tożsamości w tej sesji.
Przykład 2 – w porównaniu z IDENT_CURRENT()
Tutaj jest porównywany z IDENT_CURRENT()
.
SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
Wynik:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | 1 | 2 | 1 | +--------------+-------------------------+-------------------------+
Jak wspomniano, IDENT_CURRENT()
zwraca swój wynik na podstawie określonej tabeli. Dlatego możemy go użyć do znalezienia ostatnich wartości tożsamości dla każdej tabeli.
Przykład 3 – Przełącz na nową sesję
Teraz, jeśli otworzę nowe połączenie i wybiorę @@IDENTITY
znowu dzieje się tak:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
Wynik:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | NULL | 2 | 1 | +--------------+-------------------------+-------------------------+
@@IDENTITY
wynik ma wartość NULL, ponieważ nie wstawiłem niczego do kolumny tożsamości w nowej sesji.
IDENT_CURRENT()
wyniki nie są NULL, ponieważ ich wynik jest oparty na tabeli, a nie na sesji.
@@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT()
Zobacz IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY w programie SQL Server:jaka jest różnica? dla prostego przykładu, który omawia różnice między tymi trzema funkcjami.