Sql server T-SQL:超过最大递归深度的简单递归
我有一张表格Sql server T-SQL:超过最大递归深度的简单递归,sql-server,recursion,exceed,Sql Server,Recursion,Exceed,我有一张表格my_table rowNumber number ... 1 23 2 14 3 15 4 25 5 19 6 21 7 19 8 37 9 31 ... 1000 28 我的想法是计
my_table
rowNumber number ...
1 23
2 14
3 15
4 25
5 19
6 21
7 19
8 37
9 31
...
1000 28
我的想法是计算每个数字的长度:
rowNumber number ... length
1 23 1
2 14 1
3 15 2
4 25 3
5 19 1
6 21 2
7 19 1
8 37 2
9 31 1
...
因此,我试图从rowNumber=1
开始,通过递归连续添加所有其他行。我得到的最大递归100已在语句完成之前耗尽
错误
我的问题是:我应该找到一种方法来增加服务器上允许的最大迭代次数(鉴于查询很简单,我认为运行1000次迭代不会有问题),还是找到另一种方法
另外,100次迭代不是太低了吗
谢谢大家! 必须有一些默认阈值,这是微软选择的。这是为了防止无限循环。此外,循环在SQLServer中表现不佳,不符合其基于集合的结构
可以指定要为单个查询设置的最大递归。这将覆盖默认值
select max(length)
from enhanced_table
option (maxrecursion 1000)
注意,选项(maxrecursion 0)与无限相同。。。并可能导致infinte循环
不正确的递归CTE可能导致无限循环。对于
例如,如果递归成员查询定义返回相同的
对于父列和子列的值,将创建一个无限循环
创建。要防止无限循环,可以限制
通过使用
MAXRECURSION提示和选项中介于0和32767之间的值
INSERT、UPDATE、DELETE或SELECT语句的子句。这让
在解析代码之前,您可以控制语句的执行
正在创建循环的问题。服务器范围的默认值为100。
指定0时,不应用任何限制。只有一个MAXRECURSION值
可以为每个语句指定
如果希望在查询的开头声明maxrecursion参数。
您可以尝试构建类似以下内容的查询:
DECLARE @Query NVARCHAR(MAX)
SET @Query = N'
;WITH foo AS (
...
)
SELECT * FROM foo
OPTION (MAXRECURSION ' + CAST(@maxrec AS NVARCHAR) + ');'
然后使用Exec执行它
您可以在这里参考这个答案:您应该避免在存储过程中使用递归代码,除非您完全确定其深度永远不会超过“几个”。如果更多,你必须假设在某个时候它会达到极限并死亡。一个小问题:我想在查询的开头声明maxrecursion参数以获得正确的注释<代码>声明@max\u递归int=1000<代码>选项(maxrecursion@max\u recursion)
并且我得到错误“靠近'@max\u recursion'的语法不正确”。这意味着我不能将变量传递给“option()”语法?您必须为这个@AlexandrKapshuk创建一个动态SQL字符串
select max(length)
from enhanced_table
option (maxrecursion 1000)
DECLARE @Query NVARCHAR(MAX)
SET @Query = N'
;WITH foo AS (
...
)
SELECT * FROM foo
OPTION (MAXRECURSION ' + CAST(@maxrec AS NVARCHAR) + ');'