80

我正在尝试执行更新和选择...基本上,基于索引进行更新,然后选择已更新的行 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)

最后一个包括在内,因为当所有红色波浪线在 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.
4

3 回答 3

106

如果只有一行受到影响,则可以在没有表变量的情况下完成。

DECLARE @id INT

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

SELECT @id 
于 2016-01-04T11:09:20.937 回答
103

因为更新会影响多行,所以它需要一个表来存储其结果:

declare @ids table (id int);

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

如果您确定只有一行会受到影响,您可以像这样拉出 id:

declare @id int
select  top 1 @id = id
from    @ids
于 2013-05-30T23:12:10.000 回答
8

或者,如果只有一行受到影响:

DECLARE @id INT

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

SELECT @id 
于 2017-07-10T09:23:45.190 回答