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