首页 > 解决方案 > 在 SELECT 语句中使用“上一个”列的结果

问题描述

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

declare @a int, @b int;
select @a = 2, @b = @a * 3;
select @a, @b;

产生 {2, 6}。

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

标签: sqlsql-servertsql

解决方案


这实际上在Variables (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;

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

SELECT 2 AS a,
       a * 3 AS b;

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


推荐阅读