Freigeben über


@@IDENTITY (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

@@IDENTITY ist eine Systemfunktion, die den zuletzt eingefügten Identitätswert zurückgibt.

Transact-SQL-Syntaxkonventionen

Syntax

@@IDENTITY  

Rückgabetypen

numeric(38,0)

Hinweise

Nachdem eine , SELECT INTO, oder Massenkopie-Anweisung abgeschlossen ist, @@IDENTITY enthält sie INSERTden letzten von der Statement generierten Identitätswert.

  • Wenn die Anweisung keine Tabellen mit Identitätsspalten beeinflusste, @@IDENTITY gibt NULL.
  • Werden mehrere Zeilen eingefügt, wodurch mehrere Identitätswerte erzeugt werden, @@IDENTITY wird der zuletzt erzeugte Identitätswert zurückgegeben.
  • Wenn die Anweisung einen oder mehrere Trigger auslöst, die Einfügungen ausführen, die Identitätswerte generieren, wird @@IDENTITY unmittelbar nach der Anweisung der letzte von den Triggern generierte Identitätswert zurückgegeben.
  • Wenn ein Trigger nach einer Einfügeaktion auf einer Tabelle mit einer Identitätsspalte ausgelöst wird und der Trigger in eine andere Tabelle ohne Identitätsspalte eingefügt wird, gibt @@IDENTITY er den Identitätswert des ersten Einfügigs zurück. Der Wert @@IDENTITY wird nicht auf eine vorherige Einstellung zurückgesetzt, wenn die Or-Anweisung SELECT INTO oder Massenkopie INSERT fehlschlägt oder die Transaktion zurückgesetzt wird.

Fehlgeschlagene Anweisungen oder Transaktionen können die aktuelle Identität für eine Tabelle ändern und zu Lücken in den Identitätsspaltenwerten führen. Für den Identitätswert erfolgt kein Rollback, auch wenn für die Transaktion, die versuchte, den Wert in die Tabelle einzufügen, kein Commit ausgeführt wird. Wenn beispielsweise eine INSERT-Anweisung aufgrund eines IGNORE_DUP_KEY Verstoßes fehlschlägt, wird der aktuelle Identitätswert der Tabelle weiterhin erhöht.

@@IDENTITY, SCOPE_IDENTITY, und IDENT_CURRENT sind ähnliche Funktionen, da sie alle den zuletzt eingefügten Wert in die IDENTITY Spalte einer Tabelle zurückgeben.

  • @@IDENTITY und SCOPE_IDENTITY den zuletzt in einer Tabelle in der aktuellen Sitzung generierten Identitätswert zurückzugeben. Der SCOPE_IDENTITY Wert wird jedoch nur innerhalb des aktuellen Umfangs zurückgegeben; @@IDENTITY ist nicht auf einen bestimmten Umfang beschränkt.

  • IDENT_CURRENT ist nicht durch Umfang und Sitzung begrenzt; sie ist auf eine bestimmte Tabelle beschränkt. IDENT_CURRENT gibt den Identitätswert zurück, der für eine bestimmte Tabelle in jeder Sitzung und jedem Scope erzeugt wurde. Weitere Informationen finden Sie unter IDENT_CURRENT (Transact-SQL).

Der Anwendungsbereich der @@IDENTITY Funktion ist die aktuelle Sitzung auf dem lokalen Server, auf dem sie ausgeführt wird. Diese Funktion kann nicht für Remote- oder Verbindungsserver angewendet werden. Um einen Identitätswert auf einem anderen Server zu erhalten, müssen Sie eine gespeicherte Prozedur auf einem Remote- oder Verbindungsserver ausführen. Diese gespeicherte Prozedur (die im Kontext des Remote- bzw. Verbindungsservers ausgeführt wird) muss die Identitätswertinformationen sammeln und an die aufrufende Verbindung auf dem lokalen Server zurückgeben.

Replikation kann den @@IDENTITY Wert beeinflussen, da er innerhalb der Replikationsauslöser und gespeicherten Prozeduren verwendet wird. @@IDENTITY ist kein verlässlicher Indikator für die zuletzt vom Nutzer erstellte Identität, wenn die Spalte Teil eines Replikationsartikels ist. Du kannst die SCOPE_IDENTITY() Funktionssyntax anstelle von @@IDENTITYverwenden. Weitere Informationen finden Sie unter SCOPE_IDENTITY (Transact-SQL).

Hinweis

Die aufrufende gespeicherte Prozedur oder die Transact-SQL-Anweisung muss so umgeschrieben werden, dass sie die SCOPE_IDENTITY()-Funktion verwendet, die die neueste im Bereich dieser Benutzeranweisung verwendete Identität und nicht die Identität im Bereich des geschachtelten Triggers zurückgibt, der von der Replikation verwendet wird.

Beispiele

Das folgende Beispiel fügt eine Zeile in eine Tabelle mit einer Identitätsspalte (LocationID) ein und zeigt mithilfe von @@IDENTITY den in der neuen Zeile verwendeten Identitätswert an.

USE AdventureWorks2022;  
GO  
--Display the value of LocationID in the last row in the table.  
SELECT MAX(LocationID) FROM Production.Location;  
GO  
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)  
VALUES ('Damaged Goods', 5, 2.5, GETDATE());  
GO  
SELECT @@IDENTITY AS 'Identity';  
GO  
--Display the value of LocationID of the newly inserted row.  
SELECT MAX(LocationID) FROM Production.Location;  
GO