【问题标题】:What should I do when I go over maxrecursion with a CTE?当我使用 CTE 进行 maxrecursion 时应该怎么做?
【发布时间】:2010-10-09 10:45:18
【问题描述】:

我有一个正在执行递归的 CTE。想象问题空间的最简单方法是在世界各地的汽车中使用的电阻器,并且您拥有所有这些信息。电阻器 A 用于板 B 和 C,用于 DashAssembly D、E、F...ZZ,用于汽车 AAA、AAB 和 AAC。

我得到了一个零件的 CTE,检查了结果,一切都很好(使用 100 的 MAXRECURSION)。然后我添加了一个在零件树中更常见的零件。轰,坏了。我尝试将 MAXRECURSION 提高到 32767,但它仍然坏了。查看数据,这个特定的部分在所有地方都被使用。在第二级递归中,它有 426 个父级。依此类推,我认为是 6 级递归。这是有道理的(我认为)这是轰炸MAXRECURSION。

下一个问题是,B 计划是什么?我从来没有做过任何不使用 CTE 的递归。

更新:答案是:确保您没有任何循环引用,并确保您的递归表正确过滤了它的连接(我没有正确执行第二个连接)。基本上我搞砸了,并认为我的问题是我疯狂的狂野数据,而不是我蹩脚的 sql 技能。

【问题讨论】:

  • 我没有获得数百个级别,我有一个用于数百个其他部分的部分。我怀疑递归的级别不超过 12 级。它不深,但可以很宽。

标签: sql-server recursion common-table-expression


【解决方案1】:

大多数情况下,如果您达到递归限制,您将限制提高到 $BIGNUM 并且您仍然达到它,这意味着您有一个循环引用。

您应该检查以确保您没有任何循环引用并且您的递归表正在正确过滤。

【讨论】:

  • Msg 310, Level 15, State 1, Line 45 为 MAXRECURSION 选项指定的值 32768 超过了允许的最大值 32767。
  • 也就是说不能超过32767
  • 是的。我是说你不需要更高的递归限制,你需要不包含循环依赖的数据。找到你的循环依赖是另一个问题......
  • 即向下递归循环引用总是会达到任何递归限制,这就是它的用途。
  • 啊,你是对的,参考定义不明确。添加“检查以确保您没有任何循环引用并且您的递归表正在正确过滤”,我称之为答案。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2012-05-26
相关资源
最近更新 更多