考虑下面的例子:
declare @i int
select @i = 1, @i = 2
select @i
将@i
永远是2?
这大约是最简单的例子,我能想到的,但我用这对变量的值交换考虑。 我也相信分配(选择)的这种方法不符合ANSI标准(但很有用),但并不真正关心在这种情况下,移植的代码。
UPDATE
由于@MichaelFredrickson,我们有@ MartinSmith的答案和参考MSDN这一点。 我现在什么本文档中的第二句的意思挣扎,究竟(强调):
如果有一个SELECT语句中多次转让的条款,SQL Server不保证表达式的计算顺序。 请注意,如果在分配中引用的效果才可见。
第一句是充足的,足以从依赖于行为让我走,但是。
对于变量赋值, 马丁·史密斯回答了这个问题在这里参考MSDN :
如果有一个SELECT语句中多次转让的条款,SQL Server不保证表达式的计算顺序。 请注意,如果在分配中引用的效果才可见。
但...
如果我们处理的,而不是用变量的桌子,这是一个不同的故事。
在这种情况下,SQL Server使用的全在一次操作中,通过讨论伊茨克奔甘在T-SQL基础 。
这个概念指出,在同一个逻辑阶段的所有表现都仿佛在同一时间点评估......不管他们的左到右的位置。
因此,与相应的处理时, UPDATE
语句:
DECLARE @Test TABLE (
i INT,
j INT
)
INSERT INTO @Test VALUES (0, 0)
UPDATE @Test
SET
i = i + 10,
j = i
SELECT
i,
j
FROM
@Test
我们得到如下结果:
i j
----------- -----------
10 0
并通过全在一次评价......在SQL Server,您可以在表中交换列值,而一个中间变量/列。
大多数RBDMSs这样的行为, 因为据我所知,但MySQL是一个例外 。
编辑:
请注意,如果在分配中引用的效果才可见。
我明白这意味着如果你有一个SELECT
语句如下所示:
SELECT
@A = ColumnA,
@B = ColumnB,
@C = ColumnC
FROM MyTable
那么不要紧什么样的顺序分配进行中...你会得到相同的结果,不管是什么。 但是,如果你有类似...
SELECT
@A = ColumnA,
@B = @A,
@C = ColumnC
FROM MyTable
现在有指配 ( 中的参考 @B = @A
),并且所述顺序@A
和@B
现在分配很重要。