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等中找不到对此“功能”的任何引用。我的问题是,这是已知的可靠行为吗?
这实际上在变量 (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您不能通过定义列的别名来引用列。
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |