DECLARE @SQLPrefix nvarchar(max) , @SQLPostfix nvarchar(max) , @SQL nvarchar(max) DECLARE @BatchID bigint SET @BatchID = 2335 DECLARE @MaxNumberRecursiveSections tinyint , @Counter int , @vCounter varchar(5) , @Spacer varchar(5) ;with cte as ( SELECT s.ID [ParentID], s.ID, 1 [Level] FROM Section s WHERE ID = spRef UNION ALL SELECT c.ParentID, s.ID, [Level] + 1 FROM cte c INNER JOIN Section s ON s.spRef = c.ID WHERE s.spRef <> s.ID ) SELECT @MaxNumberRecursiveSections = MAX([Level]) FROM cte IF (OBJECT_ID('testProcedure', 'P') IS NOT NULL) DROP PROCEDURE testProcedure SELECT @SQLPrefix = ' CREATE PROCEDURE dbo.testProcedure ( @BatchID bigint ) AS BEGIN SELECT Ba.ID "@BatchID", (SELECT Student.ID "@ID", Student.studentID "@studentID", Student.nameLast "@nameLast", Student.nameFirst "@nameFirst", Student.EssayScore "@EssayScore"' SELECT @SQLPostfix = ' FROM Student WHERE Student.BatchID = Ba.ID ORDER BY Student.nameLast, Student.[ID] FOR XML PATH(''St''), TYPE) FROM Batch Ba WHERE Ba.ID = @BatchID ORDER BY Ba.ID FOR XML PATH(''SectionSummary'') END' SET @Counter = 1 SET @SQL = '' WHILE (@Counter <= @MaxNumberRecursiveSections) BEGIN SELECT @vCounter = convert(varchar, @Counter) SELECT @Spacer = REPLICATE(' ', @Counter) SELECT @SQL = @SQL + ', ' + @Spacer + ' (SELECT ' + @Spacer + ' Sec' + @vCounter + '.ID "@SecID", ' + @Spacer + ' Sec' + @vCounter + '.SectionName "@sectionName", ' + @Spacer + ' Ans.Correct "@CORRECT", ' + @Spacer + ' Ans.Wrong "@WRONG", ' + @Spacer + ' Ans.Omit "@OMIT", ' + @Spacer + ' Ans.Error "@ERROR", ' + @Spacer + ' ISNULL(cast(SS.scaledScore as varchar),''-'') "@ScaledScore", ' + @Spacer + ' ISNULL(Perc.percentile,-1) "@Percentile", ' + @Spacer + ' ISNULL(Perc.percentileRange, NULL) "@PercentileRange", ' + @Spacer + ' GE.GreEq + '''' "@GreEq", ' + @Spacer + ' GE.Grade + 0 "@GradeEquiv", ' + @Spacer + ' Perc.Stanine + 0 "@Stanine"' SET @Counter = @Counter + 1 END SELECT @Counter = @Counter - 1 WHILE (@Counter > 0) BEGIN SELECT @vCounter = convert(varchar, @Counter) SELECT @Spacer = REPLICATE(' ', @Counter) SELECT @SQL = @SQL + ' ' + @Spacer + ' FROM ' + @Spacer + ' Section Sec' + @vCounter + ' ' + @Spacer + ' LEFT JOIN TestView2 Ans ON Sec' + @vCounter + '.ID = Ans.SecID and Ans.stID = Student.ID ' + @Spacer + ' INNER JOIN [Level] Lev ON Sec' + @vCounter + '.pRef = Lev.ID and Lev.ID=Ba.levelID ' + @Spacer + ' LEFT JOIN ScaledScore SS ON Sec' + @vCounter + '.ID = SS.pRef and cast(round(Ans.CORRECT + Ans.BIAS,0) as int) BETWEEN SS.rawScore and ISNULL(SS.rawScoreHighRange,SS.rawScore) ' + @Spacer + ' AND ((Student.EssayScore IS NOT NULL and (cast(SS.EssayScore as decimal(16,2)) = cast(Student.EssayScore as decimal(16,2)) or round(cast(SS.EssayScore as decimal(16,2)),0) = round(cast(Student.EssayScore as decimal(16,2)),0))) or (Student.EssayScore IS NOT NULL and SS.EssayScore IS NULL) or (Student.EssayScore IS NULL)) ' + @Spacer + ' LEFT JOIN Percentile Perc ON SS.scaledScore BETWEEN Perc.scaledScoreLow AND ISNULL(scaledScoreHigh, scaledScoreLow) AND Sec' + @vCounter + '.ID = Perc.pRef AND ((CASE WHEN ISNUMERIC(Student.Grade)=1 THEN Student.Grade ELSE NULL END) = Perc.Grade or Perc.Grade = -1) ' + @Spacer + ' LEFT JOIN GradeEquiv GE ON SS.scaledScore BETWEEN GE.scaledScoreLow and GE.scaledScoreHigh and Sec' + @vCounter + '.ID = GE.pRef ' + @Spacer + ' AND ((Ba.Grade IS NULL and (CASE WHEN ISNUMERIC(Student.Grade)=1 THEN Student.Grade ELSE NULL END) = Perc.Grade) or (Ba.Grade IS NOT NULL and Ba.Grade = Perc.Grade) or (Perc.Grade = -1 and Student.Grade IS NULL and Ba.Grade IS NULL)) ' + @Spacer + ' WHERE ' + @Spacer + ' ' IF (@Counter = 1) BEGIN SELECT @SQL = @SQL + 'Sec' + @vCounter + '.spRef = Sec' + @vCounter + '.ID' END ELSE BEGIN SELECT @SQL = @SQL + 'Sec' + @vCounter + '.spRef = Sec' + convert(varchar, @Counter - 1) + '.ID and NOT (Sec' + @vCounter + '.spRef = Sec' + @vCounter + '.ID)' END SELECT @SQL = @SQL + ' ' + @Spacer + ' ORDER BY Sec' + @vCounter + '.OrderWeight ' + @Spacer + ' FOR XML PATH(''Sec''),TYPE)' SET @Counter = @Counter - 1 END SELECT @SQL = @SQLPrefix + @SQL + @SQLPostfix --SELECT @SQL EXEC sp_ExecuteSQL @SQL -- , N'@BatchID bigint' -- , @BatchID = @BatchID