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
Libérer: 2025-01-10 06:02:40
original
123 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal