将输出更新到变量中

Posted

技术标签:

【中文标题】将输出更新到变量中【英文标题】:UPDATE OUTPUT into a variable 【发布时间】:2013-05-30 23:07:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果只有一行受到影响,可以不用表变量来完成。

DECLARE @id INT

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

SELECT @id 

【讨论】:

我从来没有想过这个。非常好! 谢谢 Cory,我想知道更新中的 set 关键字是否能够设置变量并且有效! 这对insert 是否适用于单个受影响的行? 没有@rahoolm,只有SETSELECT关键字可以修改变量,这些关键字不能与INSERT语句一起使用 这种方法有一些限制;例如,如果您有一个 rowversion 列,这将返回 last rowversion,而不是您的更新产生的那个。【参考方案2】:

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

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

【讨论】:

您不必为结果提供表格。您可以这样做:OUTPUT INSERTED。* 当然,这会带回所有列。【参考方案3】:

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

DECLARE @id INT

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

SELECT @id 

【讨论】:

以上是关于将输出更新到变量中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 带有更新和插入的过程中最后一次选择的输出

将 sed 的输出存储到变量中

如何将 Terraform 输出变量保存到 Github Action 的环境变量中

将标准输出捕获到变量,但仍将其显示在控制台中

将 JS 变量输出到我的 PHP 文件中

将命令的输出存储在变量中[重复]