суббота, 30 марта 2013 г.

Как отформатировать результат в соответствии с иерархической структурой

Пример для опытных пользователей. Как отформатировать результат в следующем виде:

Courses
      Administration
            System Center Private Cloud
      DataBases
            MS SQL server
            MySQL
            Oracle DB
      Development
            .Net




USE tempdb
;WITH [RecursiveCTE] -- Рекурсивный CTE
AS
(
    SELECT
         BranchID
         ,Name
         ,TopBranchID
         , 1 AS Level
         , CAST(Name
             AS NVARCHAR(50))AS SortOrder
    FROM Specialist..Branch AS B
    WHERE B.TopBranchID = 0
         UNION ALL
    SELECT
         Child.BranchID
         ,CAST(
             REPLICATE('.........', Level)
             + Child.Name AS NVARCHAR(50)
         ) AS Name
         ,Child.TopBranchID
         , Level + 1 AS Level
         , CAST(Parent.SortOrder + Child.Name
             AS NVARCHAR(50))AS SortOrder
    FROM Specialist..Branch AS Child
             INNER JOIN
          [RecursiveCTE] AS Parent
    ON Child.TopBranchID = Parent.BranchID

)
SELECT
    Name
    ,BranchID
    ,TopBranchID
    ,Level
    ,SortOrder
FROM [RecursiveCTE]
ORDER BY SortOrder