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!