編集
最新の質問/フィドル編集のためにこれを試してください。同じ考えですが、再帰部分でNULLソートを処理するのを忘れたため、もう1つISNULLです。
;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スキーマと、これまでに使用したクエリを準備できれば非常に便利です。これにより、他の人はセットアップに最小限の時間を費やすことができます。また、サンプルを拡張したり、whatifクエリバリアントを提供したりする必要がある場合のディスカッションにも役立ちます。