当我在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
如果我删除了一个括号,那么一切都会正常工作(复制此版本所需的括号数量因版本而异)。
有人遇到同样的问题吗?
答案 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 /初始调查查询来说,以上内容是可以的。 >