将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