Maison > base de données > tutoriel mysql > Comment puis-je corriger les erreurs « La récursivité maximale de 100 a été épuisée » dans les CTE récursifs SQL ?

Comment puis-je corriger les erreurs « La récursivité maximale de 100 a été épuisée » dans les CTE récursifs SQL ?

Susan Sarandon
Libérer: 2025-01-10 07:10:41
original
183 Les gens l'ont consulté

How Can I Fix

Dépannage des erreurs CTE récursives SQL : dépassement de la limite de récursion

Les requêtes SQL utilisant des expressions de table communes (CTE) récursives rencontrent souvent une erreur « récursion maximale 100 épuisée ». Cela se produit lorsque les appels récursifs du CTE dépassent la limite de récursion par défaut (généralement 100).

Résoudre les erreurs CTE récursives en modifiant la requête

Illustrons avec un exemple de récupération des données des employés et de leurs responsables hiérarchiques des approbations :

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

La solution implique la clause 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>
Copier après la connexion

Cette clause contrôle la profondeur de récursion du CTE. Définir MAXRECURSION sur 0 désactive la limite de récursion, empêchant ainsi l'erreur. Cependant, la prudence est de mise : la récursivité infinie peut entraîner des problèmes de performances ou des plantages si les données hiérarchiques sont mal structurées ou contiennent des références circulaires. Examinez attentivement vos données et la logique CTE pour vous assurer qu'elles se terminent correctement avant d'utiliser MAXRECURSION 0. Une solution plus robuste pourrait impliquer de définir MAXRECURSION sur une valeur plus élevée, mais finie, ou d'analyser les données pour détecter d'éventuelles boucles infinies.

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