2012-06-12 2 views
163

Wenn ich eine Insert-Anweisung haben, wie:Wie verwende ich die OUTPUT-Klausel einer INSERT-Anweisung, um den Identitätswert abzurufen?

INSERT INTO MyTable 
( 
    Name, 
    Address, 
    PhoneNo 
) 
VALUES 
(
    'Yatrix', 
    '1234 Address Stuff', 
    '1112223333' 
) 

Wie ich @var INT auf die neue Zeile Identität Wert gesetzt haben mit der OUTPUT-Klausel (Id genannt)? Ich habe Beispiele gesehen, wie INSERTED.Name in Tabellenvariablen eingefügt wurde, aber ich kann es nicht in eine Nicht-Tabellenvariable bringen.

Ich habe versucht OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, aber keiner hat funktioniert.

+2

Ich weiß schon von @@ SCOPE_IDENTITY, ich möchte speziell wissen, wie man es mit OUPUT macht. Vielen Dank. – Yatrix

+6

Sie müssen es in eine Tabellenvariable einfügen und dann daraus auswählen. Es gibt keine Syntax, die einer Skalarvariablen direkt von der OUTPUT-Klausel zugewiesen werden kann. –

+3

Die [OUTPUT-Klausel] (http://msdn.microsoft.com/en-us/library/ms177564.aspx) muss in eine Tabelle oder Tabellenvariable ausgegeben werden. – mellamokb

Antwort

320

Sie können entweder die neu eingefügte ID in der Konsole SSMS wie diese ausgegeben:

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

Sie dies auch beispielsweise aus nutzen können C#, wenn Sie die ID zurück zu Ihrer aufrufenden App erhalten müssen - führen Sie einfach die SQL-Abfrage mit .ExecuteScalar() (anstelle von .ExecuteNonQuery()) aus, um die resultierende ID zurück zu lesen.

Oder wenn Sie die neu eingefügten ID innen T-SQL (zB für die spätere Weiterverarbeitung) erfassen müssen, müssen Sie eine Tabellenvariable erstellen:

DECLARE @OutputTbl TABLE (ID INT) 

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID INTO @OutputTbl(ID) 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

Auf diese Weise können Sie mehrere Werte setzen in @OutputTbl und weitere Verarbeitung auf diesen. Sie können auch eine "normale" temporäre Tabelle (10) oder sogar eine "echte" persistente Tabelle als Ihr "Ausgabeziel" verwenden.

+2

Die Antwort hier auf den Code hinter war knapp. ExecuteScalar() FTW –

+5

Sie können das Ergebnis in eine "echte persistente Tabelle" einfügen - das ist extrem fantastisch, weil es bedeutet, dass Sie Informationen in 'ZWEI' Tabellen gleichzeitig einfügen können. – gotqn

+2

Verwenden Sie niemals @@ IDENTITY, um von oben zu ziehen. Fud die harte Art aus, mit Triggern zu arbeiten, und da sie den Verlauf der an einer Tabelle vorgenommenen Änderungen aufzeichneten und gleichzeitig in eine neue Tabelle einfügten, begann @@ IDENTITY, Werte aus der Verlaufstabelle zurückzugeben. Heiterkeit folgt von dort! Bitte verwenden Sie die Lösung von marc_s. Vorläufig bin ich mit der @OutputTbl-Methode gegangen, aber ich bin fasziniert von den anderen Möglichkeiten. –