首頁 > 資料庫 > mysql教程 > 如何解決SQL Server遞迴CTE中的最大遞迴錯誤?

如何解決SQL Server遞迴CTE中的最大遞迴錯誤?

Patricia Arquette
發布: 2025-01-10 06:02:40
原創
127 人瀏覽過

How to Solve SQL Server's Max Recursion Error in Recursive CTEs?

在遞歸 CTE 克服 SQL Server 遞迴限制

在 SQL Server 中使用遞歸公用資料表運算式 (CTE) 時,您可能會遇到可怕的「超出最大遞歸深度」錯誤。當您的巢狀遞歸查詢超過資料庫的預定義限制時,就會發生這種情況。

解決方案涉及使用maxrecursion選項:

以下是修改查詢以解決此問題的方法:

<code class="language-sql">WITH EmployeeHierarchy AS (
    SELECT 
        EMP_SRC_ID_NR AS Id, USR_ACV_DIR_ID_TE AS Uuid, 
        ISNULL(Employees.APV_MGR_EMP_ID, '0') AS ApprovalManagerId 
    FROM 
        dbo.[tEmployees] AS Employees WITH (NOLOCK)
    WHERE 
        APV_MGR_EMP_ID = @Id 
        AND Employees.APV_MGR_EMP_ID IS NOT NULL 
        AND Employees.EMP_SRC_ID_NR IS NOT NULL  

    UNION ALL

    SELECT 
        EMP_SRC_ID_NR AS Id, USR_ACV_DIR_ID_TE AS Uuid, 
        ISNULL(Employees.UPS_ACP_EMP_NR, '1') AS ApprovalManagerId 
    FROM 
        dbo.[tEmployees] AS Employees WITH (NOLOCK)
    WHERE 
        UPS_ACP_EMP_NR = @Id 
        AND Employees.APV_MGR_EMP_ID IS NOT NULL 
        AND Employees.EMP_SRC_ID_NR IS NOT NULL  

    UNION ALL

    SELECT 
        Employees.EMP_SRC_ID_NR, Employees.USR_ACV_DIR_ID_TE, 
        ISNULL(Employees.APV_MGR_EMP_ID, '2')  
    FROM 
        dbo.[tEmployees] AS Employees WITH (NOLOCK)
    JOIN 
        EmployeeHierarchy ON Employees.APV_MGR_EMP_ID = EmployeeHierarchy.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 EmployeeHierarchy
OPTION (MAXRECURSION 0);</code>
登入後複製

透過附加OPTION (MAXRECURSION 0),您可以有效地消除遞歸限制,從而允許查詢無限期地運行。 不過,使用MAXRECURSION 0時要小心。確保您的 CTE 邏輯正確,以防止可能導致效能問題或崩潰的無限循環。如果遞歸深度出乎意料地大,請考慮替代方法。 使用 ISNULL 代替 CASE 可以簡化程式碼並提高可讀性。

以上是如何解決SQL Server遞迴CTE中的最大遞迴錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板