Я сделал этот код для аналогичной вещи, я обычно использую только столбцы LongID и LongDescription для своих нужд, я добавил случаи, чтобы вывод был похож на ваш пример, обратите внимание, что уровень начинается с 0 для моей иерархии
WITH cte AS
(
SELECT CAST(RIGHT('000' + CAST(HierarchyID AS VARCHAR),3) AS VARCHAR(100)) as M,
CAST(Description AS VARCHAR(MAX)) AS LongID, *
FROM HIERARCHY
WHERE Level = 0
UNION ALL
SELECT CAST(cte.M + '_' + RIGHT('000' + CAST(si.HierarchyID AS varchar), 3) AS VARCHAR(100)),
CAST(cte.LongID + '->' + si.Description AS VARCHAR(MAX)),
si.*
FROM HIERARCHY si
INNER JOIN cte
ON si.ParentHierarchyID = cte.HierarchyID
)
SELECT
CASE WHEN Level = 0 THEN Description ELSE '' END AS Parent6,
CASE WHEN Level = 1 THEN Description ELSE '' END AS Parent5,
CASE WHEN Level = 2 THEN Description ELSE '' END AS Parent4,
CASE WHEN Level = 3 THEN Description ELSE '' END AS Parent3,
CASE WHEN Level = 4 THEN Description ELSE '' END AS Parent1,
CASE WHEN Level = 5 THEN Description ELSE '' END AS Child,
FROM cte
ORDER BY LongID