2013-05-30 3 views
43

Ich versuche, ein Update durchzuführen und eine Auswahl ... im Grunde Update basierend auf einem Index, und wählen Sie dann die Zeile ID, die aktualisiert wurde.UPDATE OUTPUT in eine Variable

Dies ist einfach die OUTPUT-Klausel:

UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id 
WHERE Baz = 2 

Aber jetzt, wie bekomme ich diese in eine Variable?

DECLARE @id INT 

Diese drei funktionieren nicht:

UPDATE Foo 
SET Bar = 1 
OUTPUT @id = INSERTED.Id 
WHERE Baz = 2 

SET @id = 
(UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id 
WHERE Baz = 2) 

SET @id = 
(SELECT Id FROM (UPDATE Foo 
       SET Bar = 1 
       OUTPUT INSERTED.Id Id 
       WHERE Baz = 2) z) 

Das letzte eingeschlossen, weil es mich vorübergehend erregt hatte, als alle roten squigglies in Management Studio ging. Ach, ich diesen Fehler:

A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement. 

Antwort

44

herausziehen Wenn nur eine Zeile betroffen ist, kann es ohne eine Tabellenvariable erfolgen.

DECLARE @id INT 

UPDATE Foo 
SET Bar = 1, @id = id 
WHERE Baz = 2 

SELECT @id 
+1

Ich habe das noch nie gedacht. Sehr schön! –

+1

Danke Cory, ich fragte mich, ob das Set-Schlüsselwort innerhalb des Updates in der Lage sein wird, eine Variable zu setzen, und es hat funktioniert! –

+0

funktioniert dies mit 'insert' für eine einzelne betroffene Zeile? – rahoolm

62

Da ein Update auf mehrere Zeilen auswirken kann, ist es eine Tabelle die Ergebnisse zu speichern erfordert:

declare @ids table (id int); 

UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id INTO @ids 
WHERE Baz = 2 

Wenn Sie sicher sind, dass nur eine Zeile betroffen sein werden, Sie können die ID wie:

1

Alternativ wird Wenn nur eine Zeile betroffen sind:

DECLARE @id INT 

UPDATE Foo 
SET @id = Bar = 1 ---Yes, this is valid! 
WHERE Baz = 2 

SELECT @id