Вот что ты хочешь.Эта хранимая процедура использует "CTE" или "общее табличное выражение".Я не профессионал в них, но они очень полезны.Определенно рекомендуем искать их.
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetRecursiveTest
AS
BEGIN
;WITh Tree (cat_id, cat_name, parent_cat_id, level, Sort) AS
(
SELECT cat_id, cat_name, parent_cat_id, 0 AS level,
CONVERT(varchar(255), cat_name) AS Sort
FROM RecursiveTest
WHERE parent_cat_id = 0
UNION ALL
SELECT RT.cat_id, RT.cat_name, RT.parent_cat_id, Parent.level + 1 AS level,
CONVERT(varchar(255), Parent.Sort + ' -> ' + RT.cat_name) AS Sort
FROM RecursiveTest RT
INNER JOIN Tree as Parent ON Parent.cat_id = RT.parent_cat_id
)
SELECT Sort FROM Tree
ORDER BY Sort
END
GO
На самом деле, если вы измените последний выбор на "selct * from tree", вы получите больше данных об иерархии.
Вот ссылка нахороший ресурс для CTE