1

我有一个表,我需要将一个值从一列移动到另一列,然后在原始列中设置一个新值。

declare @foo table (A int, B int);

insert into @Foo select 1, 0;

update @Foo
set B = A,
    A = 2;

更新后B总是包含1或者是这种非确定性的行为,它有时会2因为 A 被首先更新而具有一个值(而且我所有的测试从来没有达到恰到好处的条件2)?


作为后续问题,如果答案是“B将永远是1”,如果我执行以下操作,我仍然会得到相同的结果吗?

update @Foo
set A = 2,
    B = A;
4

2 回答 2

4

B将始终包含1并且子句的顺序没有区别。从概念上讲,这些操作“同时”发生。

以下也适用于 SQL 来交换两个值,而不需要任何中间变量。

update @Foo
set A = B,
    B = A;
于 2012-11-19T16:56:05.357 回答
4

在执行 时update,SQL Server 会保留该行的两个版本。旧的 (aka deleted) 和新的 (aka inserted.) 分配本身只修改inserted行。所有分配都使用deleted行中的相同变量值。分配的顺序无关紧要。

output您可以使用以下子句对此进行可视化:

declare @t table (a int, b int)
insert @t values (1,2), (2,3)

update @t 
set     b=a
,       a=b
output  inserted.*
,       deleted.*

select * from @t
于 2012-11-19T17:05:11.747 回答