2

我有一张my_table表格


rowNumber    number   ...
1               23
2               14
3               15
4               25
5               19
6               21
7               19
8               37
9               31
        ...
1000            28
我想找到该列增加的连续序列的最大长度number。对于此示例,它将是 3:

14, 15, 25

我的想法是为每个数字计算这样的长度:


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
        ...
然后取最大值。为了计算length,我编写了以下使用递归的查询:

with enhanced_table as (select *
                               ,1 length
                       from    my_table 
                       where   rowNumber = 1
                       union all
                       (select b.*
                               ,case when b.number > a.number 
                                     then a.length + 1 
                                     end new_column
                       from    enhanced_table a, my_table b 
                       where   b.rowNumber = a.rowNumber + 1
                       )
select  max(length)
from    enhanced_table
所以,我试图从rowNumber = 1递归开始并连续添加所有其他行。我得到了maximum recursion 100 has been exhausted before statement completion错误。

我的问题是:我应该找到一种方法来增加服务器上允许的最大迭代次数(鉴于查询很简单,我认为运行 1000 次迭代不会有问题),还是找到另一种方法?

另外,100 次迭代的阈值是不是太低了?

谢谢!

4

2 回答 2

1

如果您希望在查询的开头声明 maxrecursion 参数。您可以尝试构建查询,例如:

    DECLARE @Query NVARCHAR(MAX)
    SET @Query = N'
    ;WITH foo AS (
        ...
     )

    SELECT * FROM foo
    OPTION (MAXRECURSION ' + CAST(@maxrec AS NVARCHAR) + ');'

并使用 Exec 执行它

你可以在这里参考这个答案:Maxrecursion parameter

于 2018-06-22T06:13:14.740 回答
1

必须有一些默认阈值,这就是微软选择的。这是为了防止无限循环。此外,循环在 SQL Server 中表现不佳,并且违背了其基于集合的结构。

您可以指定要为单个查询设置的最大递归。这会覆盖默认值。

select  max(length)
from    enhanced_table
option (maxrecursion 1000)

请注意,选项 (maxrecursion 0) 与无限制相同...并且可能导致无限循环

参考

错误组合的递归 CTE 可能会导致无限循环。例如,如果递归成员查询定义为父列和子列返回相同的值,则会创建一个无限循环。为了防止无限循环,您可以通过在 INSERT、UPDATE、DELETE 或 SELECT 语句的 OPTION 子句中使用 MAXRECURSION 提示和 0 到 32,767 之间的值来限制特定语句允许的递归级别数。这使您可以控制语句的执行,直到您解决创建循环的代码问题。服务器范围的默认值为 100。指定 0 时,不应用任何限制。每个语句只能指定一个 MAXRECURSION 值

于 2018-06-18T18:15:17.393 回答