Maison >base de données >tutoriel mysql >Comment résoudre l'erreur de récursion maximale de SQL Server dans les CTE récursifs ?

Comment résoudre l'erreur de récursion maximale de SQL Server dans les CTE récursifs ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-10 06:02:40187parcourir

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

Conquérir la limite de récursion de SQL Server dans les CTE récursifs

Lorsque vous travaillez avec des expressions de table communes (CTE) récursives dans SQL Server, vous pouvez rencontrer la redoutable erreur « profondeur de récursion maximale dépassée ». Cela se produit lorsque vos requêtes récursives imbriquées dépassent la limite prédéfinie de la base de données.

La solution consiste à utiliser l'option maxrecursion :

Voici comment modifier votre requête pour résoudre ce problème :

<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>

En ajoutant OPTION (MAXRECURSION 0), vous éliminez efficacement la limite de récursion, permettant à la requête de s'exécuter indéfiniment. Soyez cependant prudent lorsque vous utilisez MAXRECURSION 0. Assurez-vous que votre logique CTE est correcte pour éviter les boucles infinies qui pourraient entraîner des problèmes de performances ou des plantages. Envisagez des approches alternatives si la profondeur de récursion est étonnamment grande. Utiliser ISNULL au lieu de CASE simplifie le code et améliore la lisibilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn