SQL2008 +
DECLARE @MyTable TABLE ( ID INT PRIMARY KEY, ParentID INT NOT NULL ); INSERT @MyTable (ID, ParentID) SELECT 1, 0 UNION ALL SELECT 2, 0 UNION ALL SELECT 3, 2 UNION ALL SELECT 4, 2 UNION ALL SELECT 5, 0 UNION ALL SELECT 6, 1 UNION ALL SELECT 7, 2 UNION ALL SELECT 8, 7; WITH ConvertAdiacentListToHierarchyID AS ( SELECT x.ID, x.ParentID, CONVERT(VARCHAR(8000), '/' + CONVERT(VARCHAR(10), x.ID) + '/') AS Node FROM @MyTable x WHERE x.ParentID = 0 UNION ALL SELECT x.ID, x.ParentID, CONVERT(VARCHAR(8000), y.Node + CONVERT(VARCHAR(10), x.ID) + '/') AS Node FROM @MyTable x INNER JOIN ConvertAdiacentListToHierarchyID y ON x.ParentID = y.ID ) SELECT cte.*, CONVERT(HIERARCHYID, cte.Node) AS NodeAsHierachyID FROM ConvertAdiacentListToHierarchyID cte ORDER BY NodeAsHierachyID;
Results:
ID ParentID Node NodeAsHierachyID -- -------- ------- ---------------- 1 0 /1/ 0x58 6 1 /1/6/ 0x5CA0 2 0 /2/ 0x68 3 2 /2/3/ 0x6BC0 4 2 /2/4/ 0x6C20 7 2 /2/7/ 0x6CE0 8 7 /2/7/8/ 0x6CF440 5 0 /5/ 0x8C
Bogdan sahlean
source share