Ich möchte die neu erstellte ID erhalten, wenn Sie einen neuen Datensatz in die Tabelle einfügen.
Ich habe dies gelesen: http://msdn.microsoft.com/en-us/library/ms177564.aspx aber es muss eine temporäre Tabelle erstellen.
Ich möchte die ID nach der Ausführung der INSERT-Anweisung zurückgeben (vorausgesetzt, es wird nur eine INSERT-Anweisung ausgeführt).
Beispiel:
1 Joe Joe
2 Michael Mike
3 Zoe Zoe
Wenn ich eine INSERT-Anweisung ausführe, möchte ich die erstellte ID zurückgeben, also 4.
Können Sie mir sagen, wie man das mit einer SQL-Anweisung macht, oder ist das nicht möglich?
Wenn Ihre SQL Server-Tabelle eine Spalte vom Typ INT IDENTITY
(oder BIGINT IDENTITY
) hat, dann können Sie den zuletzt eingefügten Wert mit Hilfe abrufen:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
Dies funktioniert, solange Sie keine weitere Zeile eingefügt haben - es wird einfach der letzte IDENTITY
-Wert zurückgegeben, der in diesem Bereich hier ausgegeben wurde.
Es gibt mindestens zwei weitere Optionen - @@IDENTITY
und IDENT_CURRENT
- lesen Sie mehr darüber, wie sie funktionieren und inwiefern sie sich unterscheiden (und zu unerwarteten Ergebnissen führen können) in diesem ausgezeichneten Blogbeitrag von Pinal Dave hier.
Angenommen, es handelt sich um eine einfache Tabelle:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
Wir können die IDENTITY
-Werte in einer Tabellenvariablen zur weiteren Verwendung erfassen.
DECLARE @IDs TABLE(ID INT);
-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name)
OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';
SELECT ID FROM @IDs;
Das Schöne an dieser Methode ist, dass sie (a) mit mehrzeiligen Einfügevorgängen umgehen kann (SCOPE_IDENTITY()
gibt nur den letzten Wert zurück) und (b) sie vermeidet diesen Parallelitätsfehler, der zu falschen Ergebnissen führen kann, aber bisher nur in SQL Server 2008 R2 SP1 CU5 behoben ist.
Sie können verwenden:
SELECT IDENT_CURRENT(‘tablename’)
verwenden, um auf die letzte Identität für eine bestimmte Tabelle zuzugreifen.
z.B. Bei folgendem Code:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT(‘MyTable’)
SELECT IDENT_CURRENT(‘YourTable’)
Dies würde den richtigen Wert für die entsprechenden Tabellen ergeben.
Sie gibt den letzten in einer Tabelle erzeugten IDENTITY
-Wert zurück, unabhängig von der Verbindung, die den Wert erzeugt hat, und unabhängig vom Bereich der Anweisung, die den Wert erzeugt hat.
IDENT_CURRENT" ist nicht durch den Bereich und die Sitzung begrenzt; es 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 Bereich erzeugt wurde.