Here's logic I wrote for something similar. Here the table is called Employee and has usual columns (names etc) and a manager ID (who is also an employee). Edit as required.WITH manager_tree AS (SELECT e.[Id] AS [employeeID] , e.[Id] AS [stepID] , e.[managerId] AS [managerId] , 0 AS [level] , CAST(e.[firstName] + ' ' + e.[surname] AS VARCHAR(MAX)) AS [management Path] , CAST(e.[ID] AS VARCHAR(MAX)) AS [id Path]FROM employee eUNION ALL SELECT mt.[employeeId] , e2.[Id] AS [stepId] , e2.[managerID] AS [managerId] , mt.[level] + 1 AS [level] , CAST(mt.[management Path] + ' - ' + e2.[firstName] + ' ' + e2.[surname] AS VARCHAR(MAX)) , CAST(mt.[id Path] + ',' + CAST(e2.[ID] AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS [id Path]FROM manager_tree mt JOIN employee e2 ON e2.[Id] = mt.[managerId]WHERE e2.[Id] <> mt.[stepID] AND [id Path] NOT LIKE '%' + CAST(e2.[ID] AS VARCHAR(MAX)) + '%' )SELECT *FROM manager_tree
Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION