Ich weiß Scope_Identity()
, Identity()
, @@Identity
, und Ident_Current()
alle den Wert der Identitätsspalte, aber ich würde gerne den Unterschied kennen.
Ein Teil der Kontroverse, die ich habe, ist, was sie unter Umfang verstehen, wie er auf diese Funktionen oben angewendet wird.
Ich würde auch ein einfaches Beispiel für verschiedene Szenarien ihrer Verwendung lieben?
sql
sql-server
identity
Tebo
quelle
quelle
Antworten:
@@identity
Funktion gibt die zuletzt in derselben Sitzung erstellte Identität zurück.scope_identity()
Funktion gibt die zuletzt in derselben Sitzung und demselben Bereich erstellte Identität zurück.ident_current(name)
gibt die letzte Identität zurück, die für eine bestimmte Tabelle oder Ansicht in einer Sitzung erstellt wurde.identity()
Funktion wird nicht zum Abrufen einer Identität verwendet, sondern zum Erstellen einer Identität in einerselect...into
Abfrage.Die Sitzung ist die Datenbankverbindung. Der Bereich ist die aktuelle Abfrage oder die aktuell gespeicherte Prozedur.
Eine Situation, in der sich die
scope_identity()
und die@@identity
Funktionen unterscheiden, ist, wenn Sie einen Auslöser auf dem Tisch haben. Wenn Sie eine Abfrage haben, die einen Datensatz einfügt, wodurch der Trigger irgendwo einen anderen Datensatz einfügt, gibt diescope_identity()
Funktion die von der Abfrage erstellte Identität zurück, während die@@identity
Funktion die vom Trigger erstellte Identität zurückgibt.Normalerweise würden Sie die
scope_identity()
Funktion verwenden.quelle
Gute Frage.
@@IDENTITY
: Gibt den letzten Identitätswert zurück, der auf Ihrer SQL-Verbindung (SPID) generiert wurde. Meistens ist es das, was Sie wollen, aber manchmal ist es nicht so (wie wenn ein Trigger als Reaktion auf eine ausgelöst wirdINSERT
und der Trigger eine andereINSERT
Anweisung ausführt ).SCOPE_IDENTITY()
: Gibt den letzten im aktuellen Bereich generierten Identitätswert zurück (dh gespeicherte Prozedur, Trigger, Funktion usw.).IDENT_CURRENT()
: Gibt den letzten Identitätswert für eine bestimmte Tabelle zurück. Verwenden Sie diese Option nicht, um den Identitätswert von a abzurufen. DiesINSERT
unterliegt den Race-Bedingungen (dh mehreren Verbindungen, die Zeilen in dieselbe Tabelle einfügen).IDENTITY()
: Wird verwendet, wenn eine Spalte in einer Tabelle als Identitätsspalte deklariert wird.Weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Zusammenfassend: Wenn Sie Zeilen einfügen und den Wert der Identitätsspalte für die gerade eingefügte Zeile wissen möchten, verwenden Sie immer
SCOPE_IDENTITY()
.quelle
Wenn Sie den Unterschied zwischen Umfang und Sitzung verstehen, ist es sehr einfach, diese Methoden zu verstehen.
Ein sehr schöner Blog-Beitrag von Adam Anderson beschreibt diesen Unterschied:
Somit sind die Unterschiede zwischen den drei Identitätsabrufmethoden wie folgt:
quelle
Bereich bedeutet den Codekontext, der die
INSERT
Anweisung ausführtSCOPE_IDENTITY()
, im Gegensatz zum globalen Bereich von@@IDENTITY
.Gibt unterschiedliche Ergebnisse.
quelle
Wegen des von @David Freitas erwähnten Fehlers und wegen der Inkompatibilität mit der neuen Sequence-Funktion, die 2012 eingeführt wurde, würde ich empfehlen, sich von allen drei fernzuhalten. Stattdessen können Sie die OUTPUT-Klausel verwenden, um den eingefügten Identitätswert abzurufen. Der andere Vorteil ist, dass OUTPUT auch funktioniert, wenn Sie mehr als eine Zeile eingefügt haben.
Details und Beispiele finden Sie hier: Identitätskrise
quelle
Um das Problem mit zu klären
@@Identity
:Wenn Sie beispielsweise eine Tabelle einfügen und diese Tabelle Trigger für Einfügungen enthält,
@@Identity
wird die ID von der Einfügung im Trigger (alog_id
oder so) zurückgegeben, währendscope_identity()
die ID von der Einfügung in der Originaltabelle zurückgegeben wird.Wenn Sie also keine Trigger haben
scope_identity()
und@@identity
denselben Wert zurückgeben. Wenn Sie Auslöser haben, müssen Sie sich überlegen, welchen Wert Sie möchten.quelle
Scope Identity
: Identität des letzten Datensatzes, der innerhalb der ausgeführten gespeicherten Prozedur hinzugefügt wurde.@@Identity
: Identität des zuletzt im Abfragebatch hinzugefügten Datensatzes oder als Ergebnis der Abfrage, z. B. einer Prozedur, die eine Einfügung ausführt, löst der Trigger aus, der dann einen Datensatz einfügt, und gibt die Identität des eingefügten Datensatzes vom Trigger zurück.IdentCurrent
: Die letzte der Tabelle zugewiesene Identität.quelle
Hier ist eine weitere gute Erklärung aus dem Buch :
quelle