Поддержка SQL Server рекурсивные CTE , они могут вам помочь.
Вы можете построить древовидную структуру из ваших данных с помощью следующего SQL:
WITH cat_tree AS (
SELECT cat_id, cat_name, parent_id,
0 AS level, CAST('0' AS varchar(90)) AS path
FROM cats
WHERE parent_id IS NULL
UNION ALL
SELECT c.cat_id, c.cat_name, c.parent_id,
ct.level + 1,
CAST(ct.path+'.'+CAST(
(row_number() OVER (ORDER BY ct.cat_id)) AS varchar) AS varchar(90))
FROM cats c
JOIN cat_tree ct ON c.parent_id = ct.cat_id)
SELECT * FROM cat_tree
ORDER BY path;
Посмотрите на результаты SQL Fiddle .