Alb*_*uge 5 sql sql-server sql-server-2005 sql-server-2008
以下查询在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:我运行了一些分析会话,结果如下.
对于上面的查询,事件序列是:
对于没有括号的查询:
对于工作查询:
我还使用真正的表运行其中一个查询,这导致了我同样的问题.事件的顺序是:
没有早期的"例外"=>表存在.没有"SQL:StmtCompleted"=>这意味着发生了错误,我看不出为什么不会引发此事件的任何其他原因.否"Showplan All"=>表示错误发生在计算执行计划之前(或之后).它可能是由cte和括号组合引起的.
我将在下周提出微软支持的问题.
因此,根据我之前对原始问题的评论,我稍微简化了 sql。
WITH computed_tabled AS
(
SELECT id FROM this_table_does_not_existd
)
(SELECT id FROM computed_tabled)
Run Code Online (Sandbox Code Playgroud)
这似乎给了我们同样的行为。然后我跑了追踪。活动类别:
令我意想不到的是:
注意:没有 SQL:StmtCompleted,没有计划。因此,接下来,我返回到捕获设置,并在错误和警告下添加每个事件类。重新运行查询,您知道什么?第一个捕获的事件是:
Error: 208, Severity: 16, State: 1
Run Code Online (Sandbox Code Playgroud)
猜猜208是什么?但是,客户端永远不会看到错误。
我认为正在发生的事情是 DBMS 中的代码在说 - 嘿,他们没有要求我们返回任何内容或执行任何操作,所以为什么要麻烦呢?让我们为要求更高的人释放一些资源。
所以我尝试了这段代码:
--asdfasdf
( SELECT 1 )
Run Code Online (Sandbox Code Playgroud)
这完全颠覆了我的理论。括号没有被解释为表达式。相反,它们被解释为完整查询(也就是说,客户端要求返回某些内容)并返回包含 1 列和 1 行的记录集。但没有计划 - 可能 b/c 不需要计划,因为不涉及数据库对象。
所以,为了让我的头脑更加混乱,我尝试了以下方法:
declare @id as integer;
;
WITH computed_table AS
(
SELECT id FROM this_table_does_not_exist
)
select @id = (SELECT id FROM computed_table)
Run Code Online (Sandbox Code Playgroud)
这与删除括号非常相似,会产生用户错误消息。
我说,你没有错过任何东西。我认为这是 MS SQL Server 的一个错误。它看起来确实与 cte 和括号有关。我尝试用谷歌搜索提及它,但没有找到任何东西。这将让我在下一次本地 PASS 会议上有话可说。抱歉,我要补充的只是混乱。如果我学到了一些东西,我一定会把它发布在这里!
更新: 2010-06-26 10:09 CST 我访问了 Microsoft Connect,试图发现此问题被列为问题。我无法找到有关 cte 208 或cte invalid object 的内容。老实说,我不知道还有另一个可以检查的 sql server 错误列表网站。我还尝试搜索 Microsoft 支持,并再次搜索 Google。