WITH cte as
(
-- 取开始节点
SELECT ClassID,UpID,ClassName,cast(ClassName as nvarchar(max)) as ClassPath,0 AS [level] FROM dbo.Class WHERE UpID=0
UNION ALL
-- 递归所有节点
SELECT c.ClassID,c.UpID,c.ClassName,cast(replicate(' ',len(p.ClassPath))+'|_'+c.ClassName as nvarchar(MAX)) as ReportPath,p.[level] +1
FROM cte P
INNER join dbo.Class c on p.ClassID=c.UpID
)
SELECT ClassID,UpID,ClassName,ClassPath,[level] FROM cte ORDER BY ClassID