Sql server 将输出更新为变量
我正在尝试执行更新和选择。。。基本上,根据索引进行更新,然后选择已更新的行id 使用OUTPUT子句很简单: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
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。