W SQL Server możesz użyć T-SQL SCOPE_IDENTITY()
funkcja zwracająca ostatnią wartość tożsamości wstawioną do kolumny tożsamości w tym samym zakresie.
Zakres to moduł (procedura składowana, wyzwalacz, funkcja lub partia). Jeśli dwie instrukcje znajdują się w tej samej procedurze składowanej, funkcji lub partii, są w tym samym zakresie.
Zwróć uwagę, że zwraca ostatnią wartość tożsamości wygenerowaną w dowolnej tabeli 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 , niezależnie od tego, w której sesji się znajduje.
SCOPE_IDENTITY()
jest bardzo podobny do @@IDENTITY
w tym, że oba zwracają ostatnio wstawioną wartość tożsamości w bieżącej sesji. Różnica polega na tym, że SCOPE_IDENTITY()
jest ograniczony do bieżącego zakresu, natomiast @@IDENTITY
nie jest ograniczony do określonego zakresu.
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład kodu, jak to działa.
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
Powodem wyniku NULL jest to, że uruchomiłem instrukcję natychmiast po otwarciu nowego połączenia z SQL Server. SCOPE_IDENTITY()
funkcja zwraca tylko wyniki z bieżącej sesji.
Aby uzyskać wynik inny niż NULL, muszę wstawić wartość do kolumny tożsamości.
Przykład 2 – Wstaw wartość dla wyniku innego niż NULL
W tym przykładzie tworzę tabelę z kolumną tożsamości. Następnie wstawiam do tej tabeli wartość domyślną przed wybraniem zawartości tabeli, a następnie uruchomieniem SCOPE_IDENTITY()
ponownie.
CREATE TABLE scope_identity_test(id int IDENTITY(1,1)); INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+------+ | id | |------| | 1 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+ (1 row affected)
Tabela ma jeden wiersz, a jej kolumna tożsamości ma wartość 1. Jest to ostatnia wstawiona wartość tożsamości dla bieżącej sesji, więc SCOPE_IDENTITY()
zwraca również 1.
Teraz, jeśli dodam kolejny wiersz, wartość odpowiednio wzrośnie:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
Wyniki z nowej sesji
Jak wspomniano, SCOPE_IDENTITY()
zwraca tylko wyniki z tej samej sesji. Dotyczy to również @@IDENTITY
.
Więc jeśli otworzę nowe połączenie z SQL Server i uruchomię poprzedni SELECT
ponownie, otrzymuję następujące wyniki:
USE Test; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+ (1 row affected)
Teraz wstawmy nowy wiersz z tej nowej sesji:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 3 | +--------------------------------+ (3 rows affected)
Więc nadrobiło to, gdy tylko wstawiłem nową wartość tożsamości.
Wróćmy jednak do pierwotnej sesji i uruchom SELECT
oświadczenia ponownie (bez wstawiania nowego wiersza):
SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Wynik:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (3 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
Więc oryginalna SCOPE_IDENTITY()
sesji druga sesja nie wpłynęła na wyniki.
Dodawanie drugiego zakresu
Rzecz, która odróżnia SCOPE_IDENTITY()
z @@IDENTITY
, czy to SCOPE_IDENTITY()
jest ograniczona do obecnego zakresu.
Na przykład, jeśli tabela ma wyzwalacz, który wstawia wartość tożsamości do innej tabeli, SCOPE_IDENTITY()
zgłosi tylko pierwszą wartość tożsamości. Zignoruje wartość tożsamości dla drugiej tabeli, ponieważ została ona utworzona w innym zakresie @@IDENTITY
z drugiej strony zgłosiłby wartość tożsamości dla drugiej tabeli (ponieważ obejmuje wszystkie zakresy).
Aby zapoznać się z przykładem tego, co mam na myśli, zobacz IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY w SQL Server:Jaka jest różnica?
Ten artykuł zawiera przykład wyzwalacza, taki jak ten, o którym tutaj mówię.