Ich versuche, den Schlüsselwert nach einer INSERT-Anweisung zurückzubekommen. Beispiel: Ich habe eine Tabelle mit den Attributen Name und ID. id ist ein generierter Wert.
INSERT INTO table (name) VALUES('bob');
Jetzt möchte ich die ID im selben Schritt zurückbekommen. Wie wird das gemacht?
Wir verwenden Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbisch
quelle
quelle
Antworten:
Keine separate SELECT ...
Dies funktioniert auch für Nicht-IDENTITY-Spalten (z. B. GUIDs)
quelle
Verwenden Sie
SCOPE_IDENTITY()
diese Option , um den neuen ID-Wert abzurufenhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
quelle
id
ist Identitätid
, also ja.Ist die sicherste Wette, da ein bekanntes Problem mit dem OUTPUT-Klauselkonflikt bei Tabellen mit Triggern vorliegt. Dies macht dies ziemlich unzuverlässig, da selbst wenn Ihre Tabelle derzeit keine Auslöser hat - jemand, der später einen hinzufügt, Ihre Anwendung beschädigt. Zeitbombe Verhalten.
Weitere Informationen finden Sie im msdn-Artikel:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
quelle
Entity Framework führt etwas Ähnliches aus wie die Antwort von gbn:
Die Ausgabeergebnisse werden in einer temporären Tabellenvariablen gespeichert und dann wieder für den Client ausgewählt. Muss sich der Gotcha bewusst sein:
Ich habe keine Ahnung, warum EF die kurzlebige Tabelle wieder mit der realen Tabelle verbinden würde (unter welchen Umständen würden die beiden nicht übereinstimmen).
Aber genau das macht EF.
Nur SQL Server 2008 oder neuer. Wenn es 2005 ist, haben Sie kein Glück.
quelle
Customer
Datensatz "angezeigt" werden können, da möglicherweise andere DB-seitige Logik Auswirkungen darauf hat, z. B.DEFAULT
bei einigen Spalten, Triggern in der Tabelle usw. EF aktualisiert die Entität (Objekt), die für die Einfügung verwendet wird, sodass die Clientseite das Kundenobjekt mit der ID und allem anderen erhält, das den aktuellen Status der Zeile darstellt.@@IDENTITY
Ist eine Systemfunktion, die den zuletzt eingefügten Identitätswert zurückgibt.quelle
Es gibt viele Möglichkeiten, nach dem Einfügen zu beenden
IDENT_CURRENT : Gibt die letzte Identität zurück, die für eine bestimmte Tabelle oder Ansicht in einer Sitzung erstellt wurde.
SCOPE_IDENTITY : Gibt die letzte Identität aus derselben Sitzung und demselben Bereich zurück. Ein Bereich ist eine gespeicherte Prozedur / ein Trigger usw.
@@ IDENTITY : Gibt die letzte Identität aus derselben Sitzung zurück.
quelle
out put
fürbulk insert
und eingefügt vonselect statement
.Die beste und sicherste Lösung ist die Verwendung
SCOPE_IDENTITY()
.Sie müssen lediglich nach jeder Einfügung die Bereichsidentität abrufen und in einer Variablen speichern, da Sie zwei Einfügungen im selben Bereich aufrufen können.
ident_current
und@@identity
vielleicht funktionieren sie, aber sie sind kein sicherer Bereich. In einer großen Anwendung können Probleme auftretenWeitere Details finden Sie hier Microsoft-Dokumente
quelle
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
Klausel ist eine bessere, reinere Lösung :)Sie können
scope_identity()
die ID der Zeile auswählen, die Sie gerade in eine Variable eingefügt haben, und dann einfach die gewünschten Spalten aus dieser Tabelle auswählen, in der die ID = die Identität ist, aus der Sie sie erhalten habenscope_identity()
Hier finden Sie die MSDN-Informationen unter http://msdn.microsoft.com/en-us/library/ms190315.aspx
quelle
Es gibt mehrere Möglichkeiten, die zuletzt eingefügte ID nach dem Einfügebefehl abzurufen.
@@IDENTITY
: Es wird der letzte Identitätswert zurückgegeben, der in einer Verbindung in der aktuellen Sitzung generiert wurde, unabhängig von der Tabelle und dem Umfang der Anweisung, die den Wert erzeugt hatSCOPE_IDENTITY()
: Gibt den letzten Identitätswert zurück, der von der insert-Anweisung im aktuellen Bereich in der aktuellen Verbindung unabhängig von der Tabelle generiert wurde.IDENT_CURRENT(‘TABLENAME’)
: Gibt den zuletzt in der angegebenen Tabelle generierten Identitätswert zurück, unabhängig von einer Verbindung, Sitzung oder einem Bereich. IDENT_CURRENT ist nicht durch Umfang und Sitzung beschränkt. Es ist auf eine bestimmte Tabelle beschränkt.Jetzt scheint es schwieriger zu sein, zu entscheiden, welches genau zu meiner Anforderung passt.
Ich bevorzuge meistens SCOPE_IDENTITY ().
Wenn Sie in der Anweisung insert die Option SCOPE_IDENTITY () zusammen mit TableName verwenden, erhalten Sie das genaue Ergebnis gemäß Ihren Erwartungen.
Quelle: CodoBee
quelle
So verwende ich OUTPUT INSERTED, wenn ich in eine Tabelle einfüge, die ID als Identitätsspalte in SQL Server verwendet:
quelle
Sie können eine select-Anweisung an Ihre insert-Anweisung anhängen. Integer myInt = In Tabelle1 (FName) Werte einfügen ('Fred'); Wählen Sie Scope_Identity (); Dies gibt einen Wert der Identität zurück, wenn der Skalierer ausgeführt wird.
quelle
Nach dem Einfügen in eine Tabelle mit einer Identitätsspalte können Sie auf @@ IDENTITY verweisen, um den Wert abzurufen: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
quelle
* Die Reihenfolge der Parameter in der Verbindungszeichenfolge ist manchmal wichtig. * Die Position des Provider-Parameters kann den Recordset-Cursor nach dem Hinzufügen einer Zeile beschädigen. Wir haben dieses Verhalten beim SQLOLEDB-Anbieter gesehen.
Nachdem eine Zeile hinzugefügt wurde, sind die Zeilenfelder nicht verfügbar, es sei denn, der Anbieter wird als erster Parameter in der Verbindungszeichenfolge angegeben. Wenn sich der Anbieter an einer beliebigen Stelle in der Verbindungszeichenfolge befindet, außer als erster Parameter, sind die neu eingefügten Zeilenfelder nicht verfügbar. Als wir den Provider auf den ersten Parameter verschoben haben, erschienen die Zeilenfelder auf magische Weise.
quelle