Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL:超过最大递归深度的简单递归_Sql Server_Recursion_Exceed - Fatal编程技术网

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) + ');'