Le maximum de récursivité 100 a été épuisé avant la déclaration d'achèvement d'erreur indiquant dans la Requête SQL
"Le maximum de récursivité 100 a été épuisé avant la déclaration d'achèvement" erreur indiquant dans la Requête SQL
WITH DepartmentCTE AS
( SELECT ID,
DepartmentName,
RootID,
RecursionLevel = 1,
ParentRoot = CAST('None' AS NVARCHAR(max)),
LastParentCatID = RootID,
DisplayOrder
FROM Department
UNION ALL
SELECT cte.ID,
cte.DepartmentName,
cte.RootID,
cte.RecursionLevel + 1,
ParentRoot = CASE WHEN cte.RecursionLevel = 1 THEN '' ELSE cte.ParentRoot + '>' END + c.DepartmentName,
LastParentCatID = c.RootID,
cte.DisplayOrder
FROM DepartmentCTE cte
INNER JOIN Department c
ON c.ID = cte.RootID
), MaxRecursion AS
( SELECT ID,
DepartmentName,
RootID,
ParentRoot,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY RecursionLevel DESC),
DisplayOrder
FROM DepartmentCTE
)
SELECT ID, DepartmentName, RootID, ParentRoot
FROM MaxRecursion
WHERE RowNum = 1;
Vous devez vous connecter pour publier un commentaire.
Vous pouvez limiter le nombre de niveaux de récursivité à l'aide de la
MAXRECURSION
option soupçon comme ceci:OPTION (MAXRECURSION 0);
où la valeur (entre 0 et 32767) spécifie le nombre de niveaux de récursivité, 0 sens infini.De la la documentation de CTE:
Et la documentation pour les indicateurs de requête états:
L'utilisation de la déclaration d'ajouter la clause d'OPTION après la clause from DE la requête à l'aide de l'expression de table commune récursive.
Précisant 0 peut conduire à de mauvaises choses, si la requête dans une boucle infinie si.
Ne sais pas si c'est ce que vous avez prévu, mais se rendent compte de la DepartmentCTE CTE des “appels” lui-même, car la deuxième partie de son union est “De DepartmentCTE”. Ceci est très utile problème si prévu et vraiment mauvais si pas prévu. Dans votre cas, je ne vois rien de limitation de la récursivité. Le CCE serait en saillie s'appeler lui-même indéfiniment . Si vous utilisez la récursivité, normalement il y aurait une sorte de limiter l'instruction comme une “Si le Niveau...” ou “Si elle Existe...). Le niveau de récursivité de 100 est assez généreux pour la DB de l'environnement et serait d'accord avec @jpw que de l'éteindre serait mauvais. DANS votre cas serait vraiment une boucle infinie jusqu'à ce que le processus s'est écrasé ou quelque chose comme ça.
Était le bouclage de votre intention? Si pas, retirez la DepartmentCTE d'une certaine façon. Si oui, alors trouver comment limiter en fonction d'un quand on est “fait”. En cas de doute peut-être donner plus d'info sur le but de voir si nous pouvons comprendre.