Voortbouwend op het antwoord van a_horse_with_no_name, laat dit zien hoe u de implementatie van recursieve CTE door SQL Server kunt gebruiken (recursive single-record cross apply ) in combinatie met row_number() om de exacte uitvoer in de vraag te produceren.
declare @t table(id int,parentId int,name varchar(20))
insert @t select 1, 0 ,'Category1'
insert @t select 2, 0, 'Category2'
insert @t select 3, 1, 'Category3'
insert @t select 4 , 2, 'Category4'
insert @t select 5 , 1, 'Category5'
insert @t select 6 , 2, 'Category6'
insert @t select 7 , 3, 'Category7'
;
WITH tree (id, parentid, level, name, rn) as
(
SELECT id, parentid, 0 as level, name,
convert(varchar(max),right(row_number() over (order by id),10)) rn
FROM @t
WHERE parentid = 0
UNION ALL
SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
FROM @t c2
INNER JOIN tree ON tree.id = c2.parentid
)
SELECT *
FROM tree
ORDER BY cast('/' + RN + '/' as hierarchyid)
Om eerlijk te zijn, het zou werken om de ID's zelf te gebruiken om het "pad" van de boom te produceren, aangezien we rechtstreeks op id bestellen, maar ik dacht dat ik de functie row_number() zou gebruiken.