Ответ 1
Если затронута только одна строка, это можно сделать без переменной таблицы.
DECLARE @id INT
UPDATE Foo
SET Bar = 1, @id = id
WHERE Baz = 2
SELECT @id
Я пытаюсь выполнить обновление и выбрать... в основном, обновление на основе индекса, а затем выбрать обновленный идентификатор строки.
Это просто, используя предложение 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.
Если затронута только одна строка, это можно сделать без переменной таблицы.
DECLARE @id INT
UPDATE Foo
SET Bar = 1, @id = id
WHERE Baz = 2
SELECT @id
Поскольку обновление может влиять на несколько строк, для его результатов требуется таблица:
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
В качестве альтернативы, если затронута только одна строка:
DECLARE @id INT
UPDATE Foo
SET @id = Bar = 1 ---Yes, this is valid!
WHERE Baz = 2
SELECT @id