Wie erhält man am besten die Identität einer eingefügten Zeile?

Wie erhalte ich am besten die "IDENTITÄT" einer eingefügten Zeile?

Ich kenne @@IDENTITY und IDENT_CURRENT und SCOPE_IDENTITY, verstehe aber nicht die Vor- und Nachteile, die damit verbunden sind.

Kann mir bitte jemand die Unterschiede erklären und wann ich sie verwenden sollte?

Lösung
  • @@IDENTITY]1 gibt den letzten Identitätswert zurück, der für eine beliebige Tabelle in der aktuellen Sitzung erzeugt wurde, und zwar für alle Bereiche. Sie müssen hier vorsichtig sein, da es sich um einen bereichsübergreifenden Wert handelt. Sie könnten einen Wert von einem Trigger erhalten, anstatt von Ihrer aktuellen Anweisung.

  • SCOPE_IDENTITY()` gibt den letzten Identitätswert zurück, der für eine beliebige Tabelle in der aktuellen Sitzung und dem aktuellen Bereich erzeugt wurde. Generell das, was Sie verwenden wollen.

  • IDENT_CURRENT('tableName')`]3 gibt den letzten Identitätswert zurück, der für eine bestimmte Tabelle in einer beliebigen Sitzung und einem beliebigen Bereich erzeugt wurde. Damit können Sie angeben, von welcher Tabelle Sie den Wert haben wollen, falls die beiden oben genannten nicht ganz das sind, was Sie brauchen (sehr selten). Außerdem, wie @Guy Starbuck erwähnte, "Sie könnten dies verwenden, wenn Sie den aktuellen IDENTITY-Wert für eine Tabelle abrufen wollen, in die Sie keinen Datensatz eingefügt haben."

  • Mit der OUTPUT-Klausel der Anweisung "INSERT" können Sie auf jede Zeile zugreifen, die mit dieser Anweisung eingefügt wurde. Da sie auf die spezifische Anweisung beschränkt ist, ist sie einfacher als die anderen oben genannten Funktionen. Allerdings ist sie etwas ausführlicher (Sie müssen in eine Tabellenvariable/Temp-Tabelle einfügen und diese dann abfragen) und sie liefert auch in einem Fehlerszenario, in dem die Anweisung zurückgesetzt wird, Ergebnisse. Das heißt, wenn Ihre Abfrage einen parallelen Ausführungsplan verwendet, ist dies die einzige garantierte Methode, um die Identität zu erhalten (abgesehen vom Ausschalten der Parallelität). Sie wird jedoch vor Triggern ausgeführt und kann nicht verwendet werden, um von Triggern generierte Werte zurückzugeben.

Kommentare (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY und IDENT_CURRENT sind insofern ähnliche Funktionen, als sie den letzten in die IDENTITY-Spalte einer Tabelle eingefügten Wert zurückgeben.

@@IDENTITY und SCOPE_IDENTITY geben den letzten Identitätswert zurück, der in einer beliebigen Tabelle in der aktuellen Sitzung erzeugt wurde. SCOPE_IDENTITY gibt den Wert jedoch nur innerhalb des aktuellen Bereichs zurück; @@IDENTITY ist nicht auf einen bestimmten Bereich beschränkt.

IDENT_CURRENT ist nicht auf den Bereich und die Sitzung beschränkt, sondern auf eine bestimmte Tabelle. IDENT_CURRENT gibt den Identitätswert zurück, der für eine bestimmte Tabelle in jeder Sitzung und jedem Bereich erzeugt wurde. Für weitere Informationen siehe IDENT_CURRENT.

  • IDENT_CURRENT ist eine Funktion, die eine Tabelle als Argument annimmt.
  • @@IDENTITY kann ein verwirrendes Ergebnis liefern, wenn Sie einen Trigger auf die Tabelle haben
  • SCOPE_IDENTITY ist die meiste Zeit Ihr Held.
Kommentare (0)

@@IDENTITY ist die letzte Identität, die über die aktuelle SQL-Verbindung eingefügt wurde. Dies ist ein guter Wert, um ihn von einer Insert Stored Procedure zurückzugeben, wenn Sie nur die Identität für Ihren neuen Datensatz benötigen und es Ihnen egal ist, ob danach weitere Zeilen hinzugefügt wurden.

SCOPE_IDENTITY ist die letzte Identität, die über die aktuelle SQL-Verbindung und im aktuellen Gültigkeitsbereich eingefügt wurde, d.h. wenn nach Ihrer Einfügung eine zweite IDENTITY auf der Grundlage eines Triggers eingefügt wurde, würde sich dies nicht in SCOPE_IDENTITY widerspiegeln, sondern nur in der von Ihnen durchgeführten Einfügung. Ehrlich gesagt, habe ich noch nie einen Grund gehabt, dies zu verwenden.

IDENT_CURRENT(tablename) ist die zuletzt eingefügte Identität, unabhängig von Verbindung oder Bereich. Sie könnten dies verwenden, wenn Sie den aktuellen IDENTITY-Wert für eine Tabelle abrufen wollen, in die Sie keinen Datensatz eingefügt haben.

Kommentare (2)