add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE YourTable (
"CategoryID" INTEGER PRIMARY KEY,
"Node" hierarchyid,
"CategoryName" VARCHAR(100),
INDEX IX (CategoryName) INCLUDE (Node)
);

INSERT INTO YourTable
("CategoryID", "Node", "CategoryName")
VALUES
('1', 0x, 'Products'),
('2', 0x58, 'Main Category 1'),
('3', 0x68, 'Main Category 2'),
('4', 0x5AC0, 'Subcategory 1A'),
('5', 0x5B40, 'Subcategory 1B');
5 rows affected
WITH cte AS (
SELECT
t.*,
BreadCrumb = CAST(t.CategoryName AS nvarchar(max)),
ParentNode = t.Node.GetAncestor(1)
FROM YourTable t

UNION ALL

SELECT
cte.CategoryID,
cte.Node,
cte.CategoryName,
CONCAT(t.CategoryName, ' -> ', cte.BreadCrumb),
t.Node.GetAncestor(1)
FROM cte
JOIN YourTable t ON t.Node = cte.ParentNode
)
SELECT *
FROM cte
WHERE cte.ParentNode IS NULL;
CategoryID Node CategoryName BreadCrumb ParentNode
1 / Products Products null
5 /1/2/ Subcategory 1B Products -> Main Category 1 -> Subcategory 1B null
4 /1/1/ Subcategory 1A Products -> Main Category 1 -> Subcategory 1A null
3 /2/ Main Category 2 Products -> Main Category 2 null
2 /1/ Main Category 1 Products -> Main Category 1 null