Это смесь SQL и Coldfusion.Вероятно, не самый лучший формат для подписи в SQL Server, но он дает нужный формат.
SQL:
CREATE TABLE testTable(id int, parentID int)
INSERT INTO testTable(id, parentID) VALUES
(1, NULL)
, (2, 1)
, (3, 1)
, (4, NULL)
, (5, 4)
, (6, 5)
, (7, 5)
, (8, 4)
Coldfusion:
<cfscript>
qs = new query();
qs.setDatasource("datasource");
qs.setSQL("
;WITH cte AS
(
SELECT t.ID, t.parentID, 1 AS level,
CAST(DENSE_RANK() OVER (PARTITION BY t.parentID ORDER BY t.ID) AS varchar(max)) AS label
FROM testTable t
WHERE parentID IS NULL
UNION ALL
SELECT t.ID, t.parentID, cte.level + 1 AS level,
CAST(cte.label AS varchar(max)) + ' - ' + CAST(DENSE_RANK() OVER (PARTITION BY t.parentID ORDER BY t.ID) AS varchar(max)) AS label
FROM testTable t
INNER JOIN cte ON cte.ID = t.parentID
)
SELECT *,
DENSE_RANK() OVER (PARTITION BY parentID ORDER BY ID) AS [order]
FROM cte
ORDER BY label
");
qMenu = qs.execute().getResult();
oldLevel = 0;
for (i=1;i<=qMenu.recordCount;i++){
if (qMenu.level[i] > oldLevel) {
WriteOutput("<ul>");
}
while (qMenu.level[i] < oldLevel) {
WriteOutput("</ul>");
oldLevel--;
}
WriteOutput("<li>" & qMenu.label[i] & "</li>");
oldLevel = qMenu.level[i];
}
do {
WriteOutput("</ul>");
oldLevel--;
} while (oldLevel > 0);
</cfscript>