sql - 在 SELECT 语句中使用“上一个”列的结果
问题描述
T-SQL 似乎允许我们在另一列的表达式中使用列的值,从左到右。例如:
declare @a int, @b int;
select @a = 2, @b = @a * 3;
select @a, @b;
产生 {2, 6}。
我在 BOL 等中找不到对这个“功能”的任何引用。我的问题是,这是已知的、可靠的行为吗?
解决方案
这实际上在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
定义的同一列中通过其别名引用列。
推荐阅读
- logstash - 即使管道失败,Docker 上的 Logstash 也会继续运行
- python - Strange behavior when dragging a QTreeWidgetItem on macOS Sierra
- java - Can not extract Double[] from resultset
- deep-learning - 文学中“权重捆绑”表达的形式意义
- ios - 启用断点后,Xcode 10 在运行后自动停止
- javascript - 如何将主页内容与反应路由器中的其余页面分开?
- azure - 服务器的内存缓存能否在 Azure 中使用?
- angular - 维护 UI (Angular 4) 和 JAVA 之间的会话
- python - 如何将代码片段添加到 python docstring(不是 doctest)?
- sql - 使用 sql 查询将值按列添加到特定行中