it-swarm.com.de

UPDATE OUTPUT in eine Variable

Ich versuche, eine Aktualisierung und eine Auswahl durchzuführen. Im Grunde genommen aktualisiere ich anhand eines Indexes und wähle dann die Zeilen-ID aus, die aktualisiert wurde.

Dies ist einfach mit der OUTPUT-Klausel:

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

Aber wie bekomme ich das jetzt 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)

Letzteres beinhaltete, dass ich vorübergehend aufgeregt war, als alle roten Schnörkel im Management Studio verschwanden. Leider bekomme 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.
54
Cory Nelson

Wenn nur eine Zeile betroffen ist, kann auf eine Tabellenvariable verzichtet werden.

DECLARE @id INT

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

SELECT @id 
67
Arpit Jain

Da sich eine Aktualisierung auf mehrere Zeilen auswirken kann, ist eine Tabelle zum Speichern der Ergebnisse erforderlich:

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 ist, können Sie die ID wie folgt herausziehen:

declare @id int
select  top 1 @id = id
from    @ids
84
Andomar

Alternativ, wenn nur eine Zeile betroffen ist:

DECLARE @id INT

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

SELECT @id 
2
Carl Nitzsche