首页 > 数据库 > mysql教程 > 如何修复 SQL 递归 CTE 中的'最大递归 100 已耗尽”错误?

如何修复 SQL 递归 CTE 中的'最大递归 100 已耗尽”错误?

Susan Sarandon
发布: 2025-01-10 07:10:41
原创
185 人浏览过

How Can I Fix

排查 SQL 递归 CTE 错误:超出递归限制

使用递归公用表表达式 (CTE) 的 SQL 查询经常会遇到“最大递归 100 已耗尽”错误。当 CTE 的递归调用超过默认递归限制(通常为 100)时,就会出现这种情况。

通过修改查询解决递归 CTE 错误

让我们用一个检索员工数据及其分层审批经理的示例来说明:

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT 
        Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE, 
        ISNULL(Employees.APV_MGR_EMP_ID, '2')  -- Simplified NULL handling
    FROM 
        dbo.[tEmployees] as Employees WITH (NOLOCK)
    JOIN 
        EmployeeTree ON Employees.APV_MGR_EMP_ID = EmployeeTree.Id 
    WHERE 
        Employees.APV_MGR_EMP_ID IS NOT NULL 
        AND Employees.EMP_SRC_ID_NR IS NOT NULL             
)
SELECT 
    Id AS [EmployeeId], 
    Uuid AS [EmployeeUuid], 
    ApprovalManagerId AS [ManagerId] 
FROM EmployeeTree        </code>
登录后复制

解决方案涉及OPTION (MAXRECURSION)子句:

<code class="language-sql">WITH EmployeeTree AS (
    -- Anchor member of the CTE (initial query)
    ...
    UNION ALL
    SELECT ...
    FROM ...
    JOIN EmployeeTree ON ...
)
OPTION (MAXRECURSION 0)
SELECT ...
FROM EmployeeTree        </code>
登录后复制

该子句控制 CTE 的递归深度。 将MAXRECURSION设置为0会禁用递归限制,有效防止错误。 但是,建议小心:如果分层数据结构不正确或包含循环引用,无限递归可能会导致性能问题或崩溃。仔细检查您的数据和 CTE 逻辑,确保其在使用 MAXRECURSION 0 之前正确终止。 更稳健的解决方案可能涉及将 MAXRECURSION 设置为更高但有限的值,或分析数据以发现潜在的无限循环。

以上是如何修复 SQL 递归 CTE 中的'最大递归 100 已耗尽”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板