SQL Server SELECT 查询中括号的作用?

问题描述 投票:0回答:3

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

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)

在 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)

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

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

我错过了什么吗?

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

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

  • 异常(错误:208,对象名称无效)
  • SQL:批量启动
  • SQL:StmtStarting
  • SQL:批量完成

对于不带括号的查询:

  • 异常(错误:208)
  • SQL:批量启动
  • SQL:StmtStarting
  • 异常(错误:208)
  • 用户错误消息(无效的对象名称“this_table_does_not _exist”)
  • SQL:批量完成

对于工作查询:

  • SQL:批量启动
  • SQL:StmtStarting
  • 全部展示计划
  • SQL:StmtCompleted
  • SQL:批量完成

我还使用实际表运行了一个查询,这导致了我同样的问题。事件发生的顺序是:

  • SQL:批量启动
  • SQL:StmtStarting
  • SQL:批量完成

没有早期的“异常”=> 表存在。 没有“SQL:StmtCompleted”=>这意味着发生了错误,我看不出任何其他原因不会引发此事件。 No "Showplan All" => 表示错误发生在执行计划计算之前(或计算时)。可能是cte和括号组合造成的。

我将在下周向 Microsoft 支持人员提出该问题。

sql sql-server sql-server-2005 sql-server-2008
3个回答
3
投票

因此,根据我之前对原始问题的评论,我稍微简化了 sql。

WITH computed_tabled AS
(
    SELECT id FROM this_table_does_not_existd
)
(SELECT id FROM computed_tabled)

这似乎给了我们同样的行为。 然后我跑了追踪。 活动类别:

  • SQL:批量启动
  • SQL:批量完成
  • SQL:StmtStarting
  • SQL:StmtCompleted
  • 全部展示计划
  • 展示计划 XML

我捕捉到的东西是出乎意料的:

  • SQL:批量启动
  • SQL:StmtStarting
  • SQL:批量完成

注意:没有 SQL:StmtCompleted,没有计划。 因此,接下来,我返回到捕获设置,并在错误和警告下添加每个事件类。 重新运行查询,您知道什么? 第一个捕获的事件是:

Error: 208, Severity: 16, State: 1

猜猜208是什么? 但是,客户端永远不会看到错误。

认为正在发生的是DBMS中的代码在说 - 嘿,他们没有要求我们返回任何东西或做任何事情,所以为什么要麻烦呢? 让我们为要求更高的人释放一些资源。

所以我尝试了这段代码:

--asdfasdf 
( SELECT 1 )

这完全颠覆了我的理论。 括号没有被解释为表达式。 相反,它们被解释为完全查询(也就是说,客户端is要求返回某些内容)并返回包含 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)

这与删除括号非常相似,会产生用户错误消息。

我说,你没有错过任何东西。 我认为这是 MS SQL Server 的一个错误。 它看起来确实与 cte 和括号有关。 我尝试用谷歌搜索提及它,但没有找到任何东西。 这将使我在下一次本地 PASS 会议上有话可说。 抱歉,我要补充的只是混乱。如果我学到了什么,我一定会把它发布在这里!


更新 : 2010-06-26 10:09 CST 我访问了 Microsoft Connect,试图找出这个问题。我无法找到有关 cte 208 或 cte invalid object 的内容。 老实说,我不知道还有另一个可以检查的 sql server 错误列表网站。 我还尝试搜索 Microsoft 支持,并再次搜索 Google。


0
投票

有人可以帮我解决这个问题吗 Sql查询获取括号中的id 例如:“Nike Hanry(绩效管理系统)(G6789)”


-1
投票

来自微软文档https://learn.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-union-transact-sql?view=sql-server-ver15,它看起来带括号的 select 只是联合解析器中的一个特殊情况。我怀疑你是否可以将它用作常规选择。

© www.soinside.com 2019 - 2024. All rights reserved.