This guy Maulik Dhorajia answers the question perfectly ...
http://maulikdhorajia.blogspot.com/2012/06/sql-server-using-ctecommon-table.html
Made a replica of the query ..
;WITH CTECompany
AS
(
SELECT
ID,
ParentID,
Name ,
0 AS HLevel,
CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),ID),20) AS VARCHAR(MAX)) AS OrderByField
FROM Region
WHERE ParentID = 0
UNION ALL
SELECT
C.ID,
C.ParentID,
C.Name ,
(CTE.HLevel + 1) AS HLevel,
CTE.OrderByField + CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),C.ID),20) AS VARCHAR(MAX)) AS OrderByField
FROM Region C
INNER JOIN CTECompany CTE ON CTE.ID = C.ParentID
WHERE C.ParentID IS NOT NULL
)
-- Working Example
SELECT
ID
, ParentID
, HLevel
, Name
, (REPLICATE( '----' , HLevel ) + Name) AS Hierachy
FROM CTECompany
ORDER BY OrderByField