Si tout ce que vous voulez faire avec votre champ de niveau est de limiter le nombre de récursions, vous devriez pouvoir utiliser un MAXRECURSION
indice de requête
, quelque chose comme ceci :
WITH Department_CTE AS
(
SELECT
DepartmentGroupKey,
ParentDepartmentGroupKey,
DepartmentGroupName
FROM dimDepartmentGroup
WHERE DepartmentGroupKey = 2
UNION ALL
SELECT
Child.DepartmentGroupKey,
Child.ParentDepartmentGroupKey,
Child.DepartmentGroupName
FROM Department_CTE AS Parent
JOIN DimDepartmentGroup AS Child
ON Parent.ParentDepartmentGroupKey = Child.DepartmentGroupKey
)
SELECT * FROM Department_CTE
OPTION (MAXRECURSION 2)
Modifier :
En réponse à la question dans les commentaires, non, vous ne pouvez pas supprimer l'erreur que vous obtenez lorsque vous répétez plus de fois que votre paramètre MAXRECURSION ne le permet. Si je vous comprends bien, vous pourriez faire quelque chose comme ceci :
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT Id, 0 as [Level]
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
UNION ALL
SELECT t.Id, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
),
CTE2 AS
(
SELECT TestTable.*
FROM CTE
INNER JOIN TestTable ON CTE.Id = TestTable.Id
)
SELECT * FROM CTE2;
Cela devrait être aussi générique que ce que vous avez ci-dessus, en supposant que vous ne prévoyez pas de modifier les champs de clé hiérarchique ou primaire.