Você pode usar CTEs do SQL 2005 para fazer com que o mecanismo SQL faça isso recursivamente.
Uma enumeração de abordagens básicas está em http://blogs.msdn.com/anthonybloesch/archive/2006/02/15/Hierarchies-in-SQL-Server-2005.aspx
Celko também tem um livro de árvores no SQL que cobre tudo isso até o enésimo grau.
Ou você pode usar força bruta selecionando cada nível em uma variável de tabela local e, em seguida, fazendo um loop, inserindo filhos com um select, até que @@ROWCOUNT seja zero (ou seja, você não está encontrando mais filhos). Se você não tiver muitos dados, isso é fácil de codificar, mas você deu a entender que está procurando desempenho dizendo que não quer um cursor.