我有以下简单示例来说明这个问题:
select * into #table from (values (1),(2)) t(i)
;with t as (
select *, ROW_NUMBER() over (order by i) rn
from #table
)
update t
set i = i * 10
output deleted.i, deleted.rn, inserted.i
where rn = 2
正如预期的那样,UPDATE 正确地将 2 更新为 20。但是,OUTPUT 显示
i | rn | i
---+----+---
2 | 1 | 20
rn
显示 1 而不是 2。对此有什么解释吗?有没有解决方案可以在输出中输出正确的 rn,以便我可以将正确的值插入表中以保留更改结果。
谢谢。
我怀疑这更像是一个怪癖而不是一个错误,更有可能的是,您不应该能够返回的值,
rn
因为OUTPUT
它实际上不是正在被UPDATE
处理的表的一部分。Jonathan Willcock和siggemannen已经对查询计划中发生的事情做了艰苦的工作,我分别引用了他们的 评论:我怀疑,为了获得您想要的结果,您应该使用不仅
MERGE
从目标表返回列,而且还从源返回列的功能。我承认,这会导致查询更加混乱,但确实会给您正确的结果: