Advertisement
Guest User

Untitled

a guest
Jul 31st, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.99 KB | None | 0 0
  1. IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL
  2. DROP TABLE #MyTable
  3.  
  4. CREATE TABLE #MyTable (ID INT PRIMARY KEY, ParentID INT NULL, Description VARCHAR(100))
  5. INSERT INTO #MyTable (ID, ParentID, Description) VALUES
  6. (1, NULL, 'Parent'), -- Try changing the second value (NULL) to 1 or 2 or 3
  7. (2, 1, 'Child'), -- Try changing the second value (1) to 2
  8. (3, 2, 'SubChild')
  9.  
  10. ;WITH RecursiveCTE (StartingID, Level, Parents, Loop, ID, ParentID, Description) AS
  11. (
  12. SELECT ID, 1, '|' + CAST(ID AS VARCHAR(MAX)) + '|', 0, * FROM #MyTable
  13. UNION ALL
  14. SELECT R.StartingID, R.Level + 1,
  15. R.Parents + CAST(MT.ID AS VARCHAR(MAX)) + '|',
  16. CASE WHEN R.Parents LIKE '%|' + CAST(MT.ID AS VARCHAR(MAX)) + '|%' THEN 1 ELSE 0 END,
  17. MT.*
  18. FROM #MyTable MT
  19. INNER JOIN RecursiveCTE R ON R.ParentID = MT.ID AND R.Loop = 0
  20. )
  21.  
  22. SELECT StartingID, Level, Parents, MAX(Loop) OVER (PARTITION BY StartingID) Loop, ID, ParentID, Description
  23. FROM RecursiveCTE
  24. ORDER BY StartingID, Level
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement