相关疑难解决方法(0)

SQL Server SELECT查询中括号的角色?

以下查询在SQL Server 2008上没有返回结果且没有错误(在SP1上测试),您可以针对任何数据库运行它,甚至是master:

WITH computed_table (id) AS
(
    SELECT id FROM this_table_does_not_exist
)
(SELECT * FROM computed_table)
UNION
(SELECT * FROM another_table_that_does_not_exists)
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2005上,您会收到错误,因为表不存在.如果删除一些括号,也会出现错误:

WITH computed_table (id) AS
(
    SELECT id FROM this_table_does_not_exist
)
SELECT * FROM computed_table
UNION
(SELECT * FROM another_table_that_does_not_exists)
Run Code Online (Sandbox Code Playgroud)

真实表格会出现同样的问题:在某些情况下,查询不会返回任何结果,如果您进行一些细微的更改,例如删除空格或回车符,它会再次起作用...

我认为查询中可能存在问题,因为括号中的SELECT可能会被解释为表达式而不是子查询,如本页所示.但这应该至少会返回一个错误.

我错过了什么吗?

编辑26/06/2010:我运行了一些分析会话,结果如下.

对于上面的查询,事件序列是:

  • 异常(错误:208,对象名称无效)
  • SQL:BatchStarting
  • SQL:StmtStarting
  • SQL:BatchCompleted

对于没有括号的查询:

  • 例外(错误:208)
  • SQL:BatchStarting
  • SQL:StmtStarting
  • 例外(错误:208)
  • 用户错误消息(无效的对象名称't​​his_table_does_not _exist')
  • SQL:BatchCompleted

对于工作查询:

  • SQL:BatchStarting
  • SQL:StmtStarting
  • Showplan全部
  • SQL:StmtCompleted事件
  • SQL:BatchCompleted

我还使用真正的表运行其中一个查询,这导致了我同样的问题.事件的顺序是:

  • SQL:BatchStarting
  • SQL:StmtStarting
  • SQL:BatchCompleted

没有早期的"例外"=>表存在.没有"SQL:StmtCompleted"=>这意味着发生了错误,我看不出为什么不会引发此事件的任何其他原因.否"Showplan All"=>表示错误发生在计算执行计划之前(或之后).它可能是由cte和括号组合引起的.

我将在下周提出微软支持的问题.

sql sql-server sql-server-2005 sql-server-2008

5
推荐指数
1
解决办法
5464
查看次数