создать простой образец для вас:)
/ * блок создания функции для теста в sql * /
/ * FUNCTION [fn_CTE_withLevel] (@max_level int)
ВОЗВРАЩАЕТСЯ СТОЛ
КАК
RETURN
(* /
/ ******************* объявлять таблицу просто заменить реальную таблицу *****/
declare @tbl table(pid varchar(15),id varchar(15))
/* use function argument */
declare @max_level int = 3
Insert Into @tbl(pid , id)
values
/*lev1*/ ('0','1') ,
/*lev2*/ ('1','101') ,
/*lev2*/ ('1','102') ,
/*lev1*/ ('0','2') ,
/*lev2*/ ('2','201') ,
/*lev3*/ ('201','20101') ,
/*lev3*/ ('201','20102') ,
/*lev2*/ ('2','202') ,
/*lev1*/ ('0','3') ,
/*lev2*/ ('3','301') ,
/*lev2*/ ('3','302') ,
/*lev1*/ ('0','4') ,
/*lev2*/ ('4','401'),
/*lev2*/ ('4','402');
/ ******************* объявлять таблицу просто заменить реальную таблицу *****/
With cte_result(pid , id , lev)
As(
Select pid , id , 1 as lev From @tbl t
Where pid = '0' /* change to another values from list to test sub items */
Union All
Select t.pid , t.id , cte.lev + 1 as lev
From cte_result cte
inner Join @tbl t
On cte.id = t.pid
Where cte.lev < @max_level -- :) this is my idea
)
Select * From cte_result
--OPTION (MAXRECURSION 100)
- раскомментировать для функции создания
/ ) /