使用SELECT在SQL Server变量赋值执行顺序(Order of execution in

2019-07-19 21:52发布

考虑下面的例子:

declare @i int
select @i = 1, @i = 2
select @i

@i永远是2?

这大约是最简单的例子,我能想到的,但我用这对变量的值交换考虑。 我也相信分配(选择)的这种方法不符合ANSI标准(但很有用),但并不真正关心在这种情况下,移植的代码。

UPDATE

由于@MichaelFredrickson,我们有@ MartinSmith的答案和参考MSDN这一点。 我现在什么本文档中的第二句的意思挣扎,究竟(强调):

如果有一个SELECT语句中多次转让的条款,SQL Server不保证表达式的计算顺序。 请注意,如果在分配中引用的效果才可见。

第一句是充足的,足以从依赖于行为让我走,但是。

Answer 1:

对于变量赋值, 马丁·史密斯回答了这个问题在这里参考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现在分配很重要。



文章来源: Order of execution in SQL Server variable assignment using SELECT