Du kan använda SQL 2005 CTE för att få SQL-motorn att göra det rekursivt.
En uppräkning av grundläggande tillvägagångssätt finns på http://blogs.msdn.com/anthonybloesch/archive/2006/02/15/Hierarchies-in-SQL-Server-2005.aspx
Celko har också en träd i SQL-bok som täcker allt detta till n:e graden.
Eller så kan du brute force det genom att välja varje nivå i en lokal tabellvariabel och sedan loopa, infoga underordnade med ett urval, tills ditt @@ROWCOUNT är noll (dvs. du hittar inga fler barn). Om du inte har mycket data är detta lätt att koda, men du antydde att du letar efter prestanda genom att säga att du inte vill ha en markör.