Ако всичко, което искате да направите с вашето поле за ниво, е да ограничите броя на рекурсиите, трябва да можете да използвате MAXRECURSION
подсказка за заявка
, нещо като това:
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)
Редактиране:
В отговор на въпроса в коментарите, не, не можете да потиснете грешката, която получавате, когато рекурсирате повече пъти, отколкото позволява вашата настройка MAXRECURSION. Ако ви разбирам правилно, можете да направите нещо подобно:
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;
Това трябва да е също толкова общо, колкото това, което имате по-горе, ако приемем, че не планирате да променяте йерархичните полета или полетата за първичен ключ.