;WITH temp(CurrentID,NodeName,PredecessorID)
AS
(
SELECT 'AB','Predecessor','start' UNION ALL
SELECT 'CD','Predecessor','AB' UNION ALL
SELECT 'EF','Predecessor','CD' UNION ALL
SELECT 'OP','Predecessor','EF' UNION ALL
SELECT 'GH','Predecessor','CD' UNION ALL
SELECT 'KL','Predecessor','GH' UNION ALL
SELECT 'IJ','Predecessor','GH' UNION ALL
SELECT 'LM','Predecessor','IJ' UNION ALL
SELECT 'MN','Predecessor','LM' UNION ALL
SELECT 'QN','Predecessor','OP' UNION ALL
SELECT 'QN','Predecessor','KL'
)
, CTE_Recrusive
AS
(
SELECT ROW_NUMBER() OVER (ORDER By CurrentID) ROWS, CurrentID,NodeName,PredecessorID
FROm TEMP
WHERE CurrentID='QN' --and row=1
UNION ALL
SELECT c.rows, t.CurrentID,t.NodeName,t.PredecessorID
FROm CTE_Recrusive c
INNER JOIN TEMP t on c.PredecessorID = t.CurrentID
)
select PredecessorID as CurrentID,rows as Result from CTE_Recrusive
order by rows