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

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

Susan Sarandon
發布: 2025-01-10 07:10:41
原創
205 人瀏覽過

How Can I Fix

排查 SQL 遞迴 CTE 錯誤:超出遞迴限制

使用遞歸公用表表達式 (CTE) 的 SQL 查詢經常會遇到「最大遞歸 100 已耗盡」錯誤。當 CTE 的遞歸呼叫超過預設遞歸限制(通常為 100)時,就會發生這種情況。

透過修改查詢解決遞迴 CTE 錯誤

讓我們用一個檢索員工資料及其分層審核經理的範例來說明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<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)子句:

1

2

3

4

5

6

7

8

9

10

11

<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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板