レベルを数えるのと同じように、どんどん積み上げていきましょう:
WITH TempCtgry ( CtgryID, CtgryName, ParentCtgryId, Lvl ) AS (
SELECT CategoryID, CategoryName, ParentCatID, 0 as Level,
Convert( VarChar(1024), CategoryName ) as Path
FROM Category r
WHERE r.ParentCatID IS NULL
UNION ALL
SELECT r1.CategoryID, r1.CategoryName, r1.ParentCatID, TempCtgry.Lvl + 1,
Convert( VarChar(1024), Path + ' >> ' + r1.CategoryName ) as Path
FROM Category r1 INNER JOIN
TempCtgry on r1.ParentCatID = TempCtgry.CtgryID
)
SELECT *
FROM TempCtgry
パスをリンクとして Web ページに表示するには、表示するカテゴリ名と、リンクで使用する対応する ID の両方が必要です。thisなどの文字列分割関数を使用できる単純な区切り記号を使用すると、表示コードが簡素化されます。
WITH TempCtgry ( CtgryID, CtgryName, ParentCtgryId, Lvl ) AS (
SELECT CategoryID, CategoryName, ParentCatID, 0 as Level,
Convert( VarChar(1024), CategoryName ) as Path,
Convert( VarChar(1024), CategoryID ) as PathIds
FROM Category r
WHERE r.ParentCatID IS NULL
UNION ALL
SELECT r1.CategoryID, r1.CategoryName, r1.ParentCatID, TempCtgry.Lvl + 1,
Convert( VarChar(1024), Path + '|' + r1.CategoryName ) as Path,
Convert( VarChar(1024), PathIds + '|' + Convert( VarChar(9), CategoryId ) ) as PathIds
FROM Category r1 INNER JOIN
TempCtgry on r1.ParentCatID = TempCtgry.CtgryID
)
SELECT *
FROM TempCtgry
注: これは、垂直バー ("|") がカテゴリ名に出現しないことを前提としています。
ASP.NET コードは、両方のパス文字列を分割し、それらを一緒にたどってリンクを作成する必要があります。便利な表示セパレータは "»" (U+00BB: 右向き二重角引用符) です。
必要な HTML を生成するためのすべてのコードをクエリに追加することは可能ですが、それが属する場所ではありません。