【问题标题】:MS SQL: How are variables and aliases evaluated within query execution?MS SQL:如何在查询执行中评估变量和别名?
【发布时间】:2016-10-07 14:43:29
【问题描述】:

我正在从事一个 MS SQL 项目,而且对 SQL 来说总体上是新手。

在包含以下内容的查询中:

SELECT DISTINCT u.sUserType
FROM @users u

并且在声明变量之前使用别名(变量'u')(先前已声明@param)。再说一遍:

SELECT  
    ...,
    aType.hMy as hAssetType,
    ...,
    ...,
    ...,
    ...,
    etc
FROM @users u
        LEFT JOIN somTableName aType on UPPER(u.sAssetType) UPPER(aType.sType)
        LEFT JOIN etc
        LEFT JOIN etc

我来自 Javascript 背景,其中有“提升”的概念。

问: 是否可以从编译或解释的角度讨论 SQL 查询?

问: 使用后定义变量的查询执行是否与 Javascript 提升相媲美?

问: 另外,这与 SQL 标准的其他实现相比如何?

----- 编辑-----

下面的答案指出别名与变量不同。

一个变量需要先声明才能被引用,但是一个

【问题讨论】:

  • 什么是javascript提升?它有什么作用?
  • 供你使用FROM @users,表示该变量是之前声明的
  • 另外,SQL 是一种声明性语言

标签: sql-server params hoisting


【解决方案1】:
  1. 当然,在执行开始之前,SQL 引擎会解释查询并为整个查询选择一个执行计划。

  2. 您将别名与变量混为一谈。在 SQL 中,必须先声明变量,然后才能使用它。别名可以在 SQL 查询中“更高”引用,并定义为“进一步向下”,但我怀疑它是否与“提升”任何内容相当,因为 JavaScript 是逐行的,并且 SQL 查询被解释作为一个基于集合的操作。

  3. 您的意思是这在不同的 RDBMS 之间有何不同?从我合作过的几个人来看,一点也不多。

【讨论】:

  • 谢谢。在这一点上,我不确定您所说的基于单个集合的操作是什么意思。您的意思是查询在执行之前由引擎整体考虑?
  • 是的,这正是我的意思。在 JavaScript 术语中,您可能会说 SQL Server 引擎将任何整个查询视为一行代码。
  • Javascript 现在编译比解释更多我相信 - 我认为这意味着“整体优化”......但无论如何我从来没有考虑过逐行执行。谢谢你
  • 很久没有做 JavaScript 了。 :)
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 2018-10-07
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多