Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL
- DROP TABLE #MyTable
- CREATE TABLE #MyTable (ID INT PRIMARY KEY, ParentID INT NULL, Description VARCHAR(100))
- INSERT INTO #MyTable (ID, ParentID, Description) VALUES
- (1, NULL, 'Parent'), -- Try changing the second value (NULL) to 1 or 2 or 3
- (2, 1, 'Child'), -- Try changing the second value (1) to 2
- (3, 2, 'SubChild')
- ;WITH RecursiveCTE (StartingID, Level, Parents, Loop, ID, ParentID, Description) AS
- (
- SELECT ID, 1, '|' + CAST(ID AS VARCHAR(MAX)) + '|', 0, * FROM #MyTable
- UNION ALL
- SELECT R.StartingID, R.Level + 1,
- R.Parents + CAST(MT.ID AS VARCHAR(MAX)) + '|',
- CASE WHEN R.Parents LIKE '%|' + CAST(MT.ID AS VARCHAR(MAX)) + '|%' THEN 1 ELSE 0 END,
- MT.*
- FROM #MyTable MT
- INNER JOIN RecursiveCTE R ON R.ParentID = MT.ID AND R.Loop = 0
- )
- SELECT StartingID, Level, Parents, MAX(Loop) OVER (PARTITION BY StartingID) Loop, ID, ParentID, Description
- FROM RecursiveCTE
- ORDER BY StartingID, Level
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement