Ich versuche, ein Update und eine Auswahl durchzuführen ... im Grunde genommen ein Update basierend auf einem Index und wähle dann die Zeilen-ID aus, die aktualisiert wurde.
Dies ist mit der OUTPUT-Klausel einfach:
UPDATE Foo
SET Bar = 1
OUTPUT INSERTED.Id
WHERE Baz = 2
Aber wie bekomme ich das 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 schloss ein, weil es mich vorübergehend aufgeregt hatte, 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.
sql-server
Cory Nelson
quelle
quelle
insert
für eine einzelne betroffene Zeile?SET
undSELECT
können eine Variable ändern und diese Schlüsselwörter können nicht mitINSERT
Anweisung verwendet werdenDa ein Update mehrere Zeilen betreffen kann, muss eine Tabelle die Ergebnisse speichern:
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
quelle
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
quelle