编辑
试试这个最新的问题/小提琴编辑。同样的想法,但多了一个 ISNULL,因为我忘了在递归部分处理 NULL 排序。
;WITH cte AS (
SELECT 0 AS lvl, catcode, catName, parentID,
CAST(catCode AS VARCHAR(max)) AS Path,
CAST(isnull(sort,9999) AS VARCHAR(max)) AS SortPath
FROM categories WHERE parentID =0
UNION ALL
SELECT p.lvl + 1, c.catCode, c.catName, c.parentID,
p.Path + '_' + CAST(c.catCode AS VARCHAR(max)),
p.SortPath + '_' + CAST(isnull(c.sort,9999) AS VARCHAR(max))
FROM categories c
INNER JOIN cte p ON p.catCode = c.parentID
)
SELECT
catCode,
catName AS catName,
lvl,
Path,
parentID
FROM cte
ORDER BY SortPath
注意:一系列字符串连接中的单个 varchar(max) 使最终结果为 varchar(max)。一个演员就可以了。
仅供参考 - 对于未来的 SQL 问题,如果你能准备一个SQLFiddle模式,以及到目前为止你有什么查询,那就太好了。这允许其他人在设置上花费最少的时间。如果您必须扩展示例或提供 what if 查询变体,它也有助于讨论。