Подтвердить что ты не робот

UPDATE OUTPUT в переменную

Я пытаюсь выполнить обновление и выбрать... в основном, обновление на основе индекса, а затем выбрать обновленный идентификатор строки.

Это просто, используя предложение OUTPUT:

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

Но теперь, как мне получить это в переменной?

DECLARE @id INT

Эти три не работают:

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)

Этот последний включил, потому что он временно меня возбудил, когда все красные squigglies ушли в Management Studio. Увы, я получаю эту ошибку:

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.
4b9b3361

Ответ 1

Если затронута только одна строка, это можно сделать без переменной таблицы.

DECLARE @id INT

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

SELECT @id 

Ответ 2

Поскольку обновление может влиять на несколько строк, для его результатов требуется таблица:

declare @ids table (id int);

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

Если вы уверены, что будет затронута только одна строка, вы можете вытащить идентификатор, например:

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

Ответ 3

В качестве альтернативы, если затронута только одна строка:

DECLARE @id INT

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

SELECT @id