Sql server 将输出更新为变量

Sql server 将输出更新为变量,sql-server,Sql Server,我正在尝试执行更新和选择。。。基本上,根据索引进行更新,然后选择已更新的行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

我正在尝试执行更新和选择。。。基本上,根据索引进行更新,然后选择已更新的行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)
最后一条之所以包括在内,是因为当管理工作室里所有的红色曲线消失时,我一时激动。唉,我得到了这个错误:

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 @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

如果只有一行受影响,则可以在不使用表变量的情况下执行

DECLARE @id INT

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

SELECT @id 

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

DECLARE @id INT

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

SELECT @id 

我从没想过这个。很不错的!谢谢Cory,我想知道更新中的set关键字是否能够设置一个变量,它是否有效!这是否适用于单个受影响行的
insert
?否@rahoolm,只有
SET
SELECT
关键字可以修改变量,并且这些关键字不能与
insert
语句一起使用此方法存在一些限制;例如,如果您有一个rowversion列,这将返回最后一个rowversion,而不是更新后的结果。您不必有结果表。您可以这样做:OUPUT INSERTED.*当然这将带回所有的COL。