Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Użyj SCOPE_IDENTITY(), aby zwrócić ostatnio wstawioną wartość tożsamości w tym samym zakresie (SQL Server)

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ę.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa RANK() w SQL Server

  2. Jak znaleźć formaty dat używane dla określonego języka w SQL Server (T-SQL)

  3. Nie można usunąć schematu , ponieważ nie istnieje lub nie masz uprawnień. - SQL Server / samouczek TSQL, część 29

  4. błąd, ciąg lub dane binarne zostaną obcięte podczas próby wstawienia

  5. Wyrażenie CASE programu SQL Server