SQL Server 2008 Management Studio 的语法检查行为
在 SQL Server 2008 Management Studio 中,执行包含无效列引用的查询时,观察到一种意外的行为。该查询为:
<code class="language-sql">delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142)</code>
尽管 "hs_id" 并非 "HotelSupplier" 表中的有效列名(正确的列名为 "hs_key"),但查询仍成功执行,并删除了 "Photo" 表中的所有行。这就引出一个问题:由于语法问题,查询是否应该失败?
答案在于相关子查询的概念。“DELETE” 语句与子查询相关联,这意味着子查询中的 "hs_id" 引用解析为外部查询 ("Photo") 中的 "hs_id" 列。
这是一种有效行为,允许查询引用父表中的列,而无需显式指定表名。在本例中,结果等效于:
<code class="language-sql">delete from Photo where Photo.hs_id in (select Photo.hs_id from HotelSupplier where id = 142)</code>
外部查询的模式会传播到子查询,即使子查询本身没有显式投影任何列。
因此,SQL Server 允许此类“语法不符合规范”的查询成功执行,并将子查询中未限定的列引用关联到外部查询,这被认为是正常行为。
以上是为什么 SQL Server 2008 Management Studio 允许在相关子查询中使用无效列引用的删除查询成功执行?的详细内容。更多信息请关注PHP中文网其他相关文章!