Der beste Weg, um die Identität der eingefügten Zeile zu erhalten?
Was ist der beste Weg, um IDENTITY
der eingefügten Zeile?
Weiß ich über @@IDENTITY
und IDENT_CURRENT
und SCOPE_IDENTITY
aber nicht verstehen, die vor-und Nachteile an jeden.
Kann mir bitte jemand erklären, die Unterschiede und Wann sollte ich mit jedem?
InformationsquelleAutor der Frage Oded | 2008-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
@@IDENTITY
liefert den letzten identity-Wert erzeugt für jede Tabelle in der aktuellen Sitzung in allen Gültigkeitsbereichen. Sie müssen hier vorsichtig seinda es über scopes. Sie könnten einen Wert aus einem trigger, der anstelle von Ihrem aktuellen statement.SCOPE_IDENTITY()
liefert den letzten identity-Wert erzeugt für jede Tabelle in der aktuellen Sitzung und der aktuelle Bereich. In der Regel, was Sie verwenden möchten.IDENT_CURRENT('tableName')
gibt den letzten Identitätswert generiert, die für eine bestimmte Tabelle in einer Sitzung oder einem Gültigkeitsbereich. Diese können Sie angeben, welche Tabelle Sie wollen den Wert aus, falls die beiden oben genannten sind nicht so ganz das, was Sie brauchen (sehr selten). Auch, wie @Kerl Starbuck erwähnt, "könnte Man dies verwenden, wenn Sie möchten, Holen Sie sich die aktuellen IDENTITY-Wert für eine Tabelle, die Sie eingesetzt haben, einen Datensatz in."Den
OUTPUT
- Klausel derINSERT
- Anweisung wird der Zugriff auf jede Zeile, die eingefügt wurde, über diese Aussage. Da es bezieht sich auf die spezifische Aussage, es ist einfacher als die anderen oben genannten Funktionen. Jedoch, es ist ein wenig Ausführlicher (Sie brauchen, um einen insert in eine Tabelle variable/temp-Tabelle und Abfrage) und es gibt Ergebnisse in ein Fehler-Szenario, in dem die Anweisung wird ein Rollback ausgeführt. Das heißt, wenn Sie Ihre Abfrage, die einen paralllen Ausführungsplan, dies ist die nur garantierte Methode für immer die Identität (kurz ausschalten Parallelität). Es ist jedoch ausgeführt vor - Trigger und kann nicht verwendet werden, um wieder auslösen-generierte Werte.InformationsquelleAutor der Antwort bdukes
Ich glaube, die sicherste und Genaueste Methode zum abrufen der eingefügte id mit Hilfe der output-Klausel.
Beispiel (entnommen aus dem folgenden MSDN Artikel)
InformationsquelleAutor der Antwort Orry
Ich sage das gleiche wie die anderen Jungs, so dass jeder das richtige, ich versuche nur zu machen, mehr klar.
@@IDENTITY
gibt die id der letzten Sache, die eingefügt wurde, von Ihrem client die Verbindung zur Datenbank aus.Die meisten der Zeit dies funktioniert gut, aber manchmal ist ein Auslöser zu gehen, und fügen Sie eine neue Zeile, die Sie nicht kennen, und Sie erhalten die ID in die neue Zeile, statt die, die Sie wollen
SCOPE_IDENTITY()
löst dieses problem. Es gibt die id der letzten Sache, die Sie eingefügt in den SQL-code Sie geschickt auf die Datenbank. Wenn Trigger gehen, und erstellen Sie zusätzliche Zeilen, die Sie wird nicht dazu führen, den falschen Wert zu erhalten, zurückgegeben. HurraIDENT_CURRENT
gibt die Letzte ID, die eingefügt wurde, von niemandem. Wenn eine andere app passiert, legen Sie eine weitere Zeile an eine unforunate Zeit, erhalten Sie die ID der Zeile, statt Ihren.Wenn du auf Nummer sicher gehen wollen, verwenden Sie immer
SCOPE_IDENTITY()
. Wenn du dich mit@@IDENTITY
und jemand beschließt, fügen Sie einen trigger-später, alle Ihre code zu brechen.InformationsquelleAutor der Antwort Orion Edwards
Die beste (sprich: sicherste) Weg, um die Identität der neu eingefügte Zeile ist mit der
output
Klausel:InformationsquelleAutor der Antwort Ian Kemp
Hinzufügen
dem Ende der insert-sql-Anweisung, dann
abgerufen werden.
InformationsquelleAutor der Antwort Jim
MSDN
InformationsquelleAutor der Antwort Jakub Šturc
@@IDENTITY ist die Letzte Identität eingefügt, mit der aktuellen SQL-Verbindung. Dies ist ein guter Wert, der zurückgegeben von einem insert-gespeicherte Prozedur, wo Sie müssen nur die Identität eingefügt, für Ihre neue Platte, und kümmern sich nicht, wenn weitere Zeilen Hinzugefügt wurden danach.
SCOPE_IDENTITY ist die Letzte Identität eingefügt, mit der aktuellen SQL-Verbindung, und in den aktuellen Bereich -- ist, wenn es eine zweite IDENTITÄT eingefügt, basierend auf einem trigger nach dem einfügen, würde es nicht widergespiegelt werden, in SCOPE_IDENTITY, nur die Platte, die Sie durchgeführt haben. Ehrlich gesagt, ich hatte noch nie einen Grund, dies zu nutzen.
IDENT_CURRENT(tablename) ist die Letzte Identität eingefügt, unabhängig von Verbindung oder Umfang. Könnte man dies verwenden, wenn Sie möchten, Holen Sie sich die aktuellen IDENTITY-Wert für eine Tabelle, die Sie eingesetzt haben, einen Datensatz in.
InformationsquelleAutor der Antwort Guy Starbuck
Wenn Sie Entity Framework, die es intern verwendet, die
OUTPUT
Technik zurück die neu eingefügte ID-WertWerden die ausgegebenen Ergebnisse werden in einer temporären Tabelle variable, trat zurück an den Tisch, und gibt die Zeilen mit dem Wert aus der Tabelle.
Hinweis: ich habe keine Ahnung, warum EF-würde inner join die Ephemere Tabelle zurück in die eigentliche Tabelle (unter welchen Umständen würden sich die beiden nicht überein).
Aber das ist, was EF macht.
Diese Technik (
OUTPUT
) ist nur verfügbar, die auf SQL Server 2008 oder neuer.InformationsquelleAutor der Antwort Ian Boyd
IMMER verwenden Sie scope_identity(), es gibt NIE eine Notwendigkeit für etwas anderes.
InformationsquelleAutor der Antwort erikkallen
Ich kann nicht sprechen, andere Versionen von SQL Server, aber in 2012, die Ausgabe direkt funktioniert Prima. Sie brauchen nicht die Mühe mit einer temporären Tabelle.
Durch die Art und Weise, diese Technik funktioniert auch beim einfügen von mehreren Zeilen an.
Ausgabe
InformationsquelleAutor der Antwort MarredCheese
Nach Ihrer Insert-Anweisung, die Sie brauchen, um hinzuzufügen. Und Stellen Sie sicher das der name der Tabelle wo die Daten einfügen.Sie erhalten aktuelle Zeile nicht, wo betroffene Zeile gerade jetzt, indem Sie Ihre insert-Anweisung.
InformationsquelleAutor der Antwort Khan Ataur Rahman