Jika semua yang ingin Anda lakukan dengan bidang level Anda adalah membatasi jumlah rekursi, Anda harus dapat menggunakan MAXRECURSION
petunjuk kueri
, kira-kira seperti ini:
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)
Sunting:
Sebagai jawaban atas pertanyaan di komentar, tidak, Anda tidak dapat menekan kesalahan yang Anda dapatkan saat berulang lebih dari yang dimungkinkan oleh pengaturan MAXRECURSION Anda. Jika saya memahami Anda dengan benar, Anda dapat melakukan sesuatu seperti ini:
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;
Ini harus sama generiknya dengan apa yang Anda miliki di atas, dengan asumsi Anda tidak berencana mengubah bidang kunci utama atau hierarkis.