Кроме того, в последних версиях SQL Server это можно сделать с помощью рекурсивного выражения общих таблиц.
См. этот вопрос MSDN и ответы на него. Цитировать:
WITH EmpCTE(empid, empname, mgrid, IsRoot)
AS
(
-- Anchor Member (AM)
SELECT empid, empname, mgrid, CASE WHEN mgrid IS NULL THEN 1 ELSE 0 END IsRoot
FROM Employees
WHERE empid = @empid
UNION ALL
-- Recursive Member (RM)
SELECT M.empid, M.empname, M.mgrid, CASE WHEN M.mgrid IS NULL THEN 1 ELSE 0 END
FROM Employees AS M
JOIN EmpCTE AS E
ON E.mgrid = M.empid
)
SELECT * FROM EmpCTE
GO
Это даст вам отправную точку.