Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden Sie @@IDENTITY, um den zuletzt eingefügten Identitätswert in SQL Server zurückzugeben

In SQL Server können Sie den T-SQL-@@IDENTITY verwenden Systemfunktion, um den zuletzt eingefügten Identitätswert in der aktuellen Sitzung zurückzugeben.

Beachten Sie, dass es den letzten Identitätswert zurückgibt, der in beliebig generiert wurde Tabelle in der aktuellen Sitzung . Dies steht im Gegensatz zu IDENT_CURRENT() -Funktion, die den zuletzt eingefügten Identitätswert für eine bestimmte Tabelle zurückgibt .

Der SCOPE_IDENTITY() Funktion ist sehr ähnlich zu @@IDENTITY , dass es auch den zuletzt eingefügten Identitätswert in der aktuellen Sitzung zurückgibt. Der Unterschied besteht darin, dass SCOPE_IDENTITY() ist auf den aktuellen Geltungsbereich beschränkt.

Beispiel 1

Hier ist ein einfaches Codebeispiel von @@IDENTITY Nutzung.

SELECT @@IDENTITY AS [Last-Inserted Identity Value];

Ergebnis:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+

Der Grund dafür gibt NULL zurück liegt daran, dass ich eine neue Sitzung mit SQL Server geöffnet und während meiner aktuellen Sitzung noch keine Identitätsspalte aktualisiert habe.

Unten ist ein Code, der einige Identitätsspaltenaktualisierungen durchführt.

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];

Ergebnis:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+

Hier erstelle ich ein paar Tabellen, füge einige Daten ein und wähle dann den aktuellen Identitätswert aus.

Der aktuelle Identitätswert ist 2, weil ich zwei Zeilen in diese Tabelle eingefügt habe.

Nun fügen wir eine Zeile in die andere Tabelle ein:

INSERT Dogs DEFAULT VALUES;
SELECT @@IDENTITY AS [Last-Inserted Identity Value];

Ergebnis:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 1                              |
+--------------------------------+

Der zurückgegebene Wert ist 1, da dies der zuletzt eingefügte Identitätswert für diese Sitzung ist.

Beispiel 2 – Vergleich mit IDENT_CURRENT()

Hier wird es mit IDENT_CURRENT() verglichen .

SELECT 
  @@IDENTITY AS [@@IDENTITY],
  IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')],
  IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];

Ergebnis:

+--------------+-------------------------+-------------------------+
| @@IDENTITY   | IDENT_CURRENT('Cats')   | IDENT_CURRENT('Dogs')   |
|--------------+-------------------------+-------------------------|
| 1            | 2                       | 1                       |
+--------------+-------------------------+-------------------------+

Wie bereits erwähnt, IDENT_CURRENT() gibt sein Ergebnis basierend auf der angegebenen Tabelle zurück. Daher können wir es verwenden, um die letzten Identitätswerte für jede Tabelle zu finden.

Beispiel 3 – Zu einer neuen Sitzung wechseln

Wenn ich jetzt eine neue Verbindung eröffne und @@IDENTITY wähle Auch hier passiert Folgendes:

USE Test;
SELECT 
  @@IDENTITY AS [@@IDENTITY],
  IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')],
  IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];

Ergebnis:

+--------------+-------------------------+-------------------------+
| @@IDENTITY   | IDENT_CURRENT('Cats')   | IDENT_CURRENT('Dogs')   |
|--------------+-------------------------+-------------------------|
| NULL         | 2                       | 1                       |
+--------------+-------------------------+-------------------------+

Der @@IDENTITY Das Ergebnis ist NULL, da ich in der neuen Sitzung nichts in eine Identitätsspalte eingefügt habe.

Der IDENT_CURRENT() Ergebnisse sind nicht NULL, da ihr Ergebnis auf der Tabelle basiert – nicht auf der Sitzung.

@@IDENTITY vs. SCOPE_IDENTITY() vs. IDENT_CURRENT()

Siehe IDENT_CURRENT vs. @@IDENTITY vs. SCOPE_IDENTITY in SQL Server:Was ist der Unterschied? für ein einfaches Beispiel, das die Unterschiede zwischen diesen drei Funktionen erläutert.