首頁 >資料庫 >mysql教程 >如何修復 SQL 遞歸 CTE 中的「最大遞歸 100 已耗盡」錯誤?

如何修復 SQL 遞歸 CTE 中的「最大遞歸 100 已耗盡」錯誤?

Susan Sarandon
Susan Sarandon原創
2025-01-10 07:10:41185瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn