SQL Server中范围变量的范围

时间:2016-11-20 03:38:56

标签: sql sql-server tsql variables scope

请考虑以下声明:

SELECT a.* 
FROM tblA a 
WHERE a.Name = @Name 

UNION 

(SELECT a.* 
 FROM tblB 
 WHERE a.Name = @Name)

请注意,两个不同表的范围变量(也称为别名)具有相同的名称。

这样做是否存在冲突或含糊不清的可能性?是否应在语句中为所有范围变量(别名)指定唯一名称,例如:

SELECT a.* 
FROM tblA a 
WHERE a.Name = @Name 

UNION 

(SELECT b.* 
 FROM tblB 
 WHERE b.Name = @Name)

经验表明,到目前为止这已经发挥作用......每个范围变量(别名)的范围似乎并不跨越UNION,但这取决于不支持的行为,或者范围变量(别名)是否具有正式定义与此类案件相关的范围?

1 个答案:

答案 0 :(得分:3)

你向我扔了“范围变量”一词。我一直认为这个结构叫做“别名”。

我不是SQL标准方面的专家,但我无法理解数据库引擎在重用表别名时遇到问题的解释。 UNION之前和之后的每个SELECT语句就是一个 - 一个功能完备的完整SELECT语句。这两个陈述完全相互独立 - 对另一方都不了解。无法将第一个查询中的行与第二个查询中的行相关联,因此我看不到别名如何相互干扰。

您已经证明它适用于SQL Server。

我在SQL Fiddle上尝试过,它适用于MySQL,PostgreSQL和SQLite。不幸的是,Oracle和MS SQL Server在小提琴网站上被打破了,所以无法在那里进行测试。