UPDATE OUTPUT变成一个变量


70

我正在尝试执行更新和选择...基本上,基于索引进行更新,然后选择已更新的行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中的所有红色弯曲消失时,它让我暂时感到兴奋。las,我收到此错误:

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.

Answers:


92

如果只影响一行,则可以不使用表变量来完成。

DECLARE @id INT

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

SELECT @id 

5
我什至没有想到这一点。非常好!
科里·纳尔逊

2
谢谢Cory,我想知道更新中的set关键字是否能够设置一个变量并且它起作用了!
Arpit Jain

可以insert用于单个受影响的行吗?
rahoolm

否@rahoolm,只有SETandSELECT关键字可以修改变量,并且这些关键字不能与INSERT语句一起使用
Arpit Jain

1
这种方法有一些局限性。例如,如果您有一个rowversion列,它将返回上一个rowversion,而不是更新后的结果。
user1664043'4

94

由于更新会影响多行,因此需要一个表来存储其结果:

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

1
您不必为结果提供表格。您可以执行以下操作:OUPUT INSERTED。*当然,这将带回所有列。
诺伯特·诺伯森

6

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

DECLARE @id INT

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

SELECT @id 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.