在SELECT语句中使用“上一个”列的结果

Rik*_*ley 6 sql t-sql sql-server

T-SQL似乎允许我们在另一列的表达式中使用列的值,从左到右。例如:

declare @a int, @b int;
select @a = 2, @b = @a * 3;
select @a, @b;
Run Code Online (Sandbox Code Playgroud)

产生{2,6}。

我在BOL等中找不到对此“功能”的任何引用。我的问题是,这是已知的可靠行为吗?

use*_*983 4

这实际上在变量 (Transact-SQL)中作为警告进行了介绍:

警告

如果单个 SELECT 语句中有多个赋值子句,SQL Server 不保证表达式计算的顺序。请注意,只有在作业之间存在引用时,效果才可见。

(强调我的)

SQL Server 确实一次为一个变量分配值,因此在这个(简单)示例中,SQL Server 在@a对表达式进行求值(和分配)之前@a * 3已将的值分配给@b

正如警告所说,不要指望行为总是相同的。如果您需要保证分配按严格的顺序进行,请将分配作为单独的语句进行:

DECLARE @a int,
        @b int;
SET @a = 2;
SET @b  = @a * 3;
SELECT @a, @b;
Run Code Online (Sandbox Code Playgroud)

编辑:使用非赋值表达式时,不存在此行为。例如,以下语句将失败,并显示错误“无效的列名 'a'”。:

SELECT 2 AS a,
       a * 3 AS b;
Run Code Online (Sandbox Code Playgroud)

您所描述的行为仅发生在赋值语句中。SELECT您不能通过定义列的别名来引用列。