将OUTPUT更新为一个variables

我试图执行更新和select…基本上,更新基于索引,然后select已更新的行ID。

使用OUTPUT子句很简单:

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

但现在,我怎么把这个变成一个variables呢?

 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) 

最后一个包括,因为当pipe理工作室里所有的红色小丑都离开时,它让我暂时兴奋起来。 唉,我得到这个错误:

 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. 

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

 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 

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

 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