SQL Server:“您的SQL语句的某些部分嵌套得太深。重写查询或将其分解为较小的查询。”

时间:2018-12-12 15:36:22

标签: sql sql-server

当我在SQL Server数据库(v12.0)上执行此处显示的代码时,出现错误

  

SQL语句的某些部分嵌套得太深。重写查询或将其分解为较小的查询

我的代码:

CREATE TABLE [dbo].[Table]
(
    [test] [INT] NOT NULL
) ON [PRIMARY]
GO

SELECT * 
FROM [dbo].[Table] AS [Table]
WHERE 1 = 1 
  AND (1 = 1 AND 
( (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((((((((((((((((((((((
[Table].[test] BETWEEN 1 AND 1
) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
))))))))))))))))))))))))))))))))))))))))))))))))))))

DROP TABLE [dbo].[Table]
GO

如果我删除了一个括号,那么一切都会正常工作(复制此版本所需的括号数量因版本而异)。

有人遇到同样的问题吗?

2 个答案:

答案 0 :(得分:0)

您为什么要这样做?我没有找到它的意义,但我认为问题是括号太多,服务器不知道该怎么做,您需要多少个括号才能得到错误,两者之间的区别可能在于版本,因为每个版本都有不同的播放内存的方式,还有服务器中的Ram。

答案 1 :(得分:0)

当您只需要嵌套太多查询时,就会发生这种情况。不同版本在优化器解析和组织查询的方式上可能会有所不同,在这种情况下,嵌套的有效上限可能会有所不同,具体取决于运行它的位置。

我通常是通过一些数据清理活动在临时工作时得到的,这对于构建怪物查询,嵌套嵌套,子选择,大写语句等很有用。当您接连遇到另一个问题时。在这方面,在尝试进行优化并提出最终解决方案之前,将其包含在一个怪兽查询中会很有帮助(并节省大量时间)。但是走得太远,就在这里。

为了解决这个问题,我最终用临时表对它进行了分块,用临时表替换了SQL(或更多)的自包含块/子查询。例如,说查询的超简化版本是这样的:

select ...
from 
(
  select ...
  from
    (
      select innerfield1, innerfield2, innerfield3, ...
      from ...
      where ...
    ) inner
    join ...
) outer

那么您可以这样做:

if object_id('tempdb.dbo.#temp_inner', 'U') is not null drop table #temp_inner;
create table #temp_inner
(
  [innerfield1] int, 
  [innerfield2] nvarchar(100), 
  [innerfield3] datetime, 
  ...
)

然后将其填充一次...

insert into #temp_inner
select innerfield1, innerfield2, innerfield3, ...
from ...
where ...

,现在替换原始查询的这一部分:

select ...
from 
(
  select ...
  from #temp_inner inner
    join ...
) outer

现在,您可以使用现在缓存的内部遍历运行此外部查询。即使您没有遇到任何限制,只是内部已经变得稳定,而您现在正在外部工作,这甚至是一个好主意。

正如评论员所提到的,在生产代码中没有这种情况;应该打破查询,这不仅是因为通常是最佳选择,还应该是出于诸如故障排除,支持能力之类的基本原因。但是,对于复杂的 ad hoc /初始调查查询来说,以上内容是可以的。 >