You can create your queries dynamically.
DECLARE @SQL NVARCHAR(MAX) = (SELECT ' WITH CTE AS ( SELECT childID ,parentID, 0 AS depth,name FROM myTable WHERE childID = parentID AND childID = '+CAST(childID AS NVARCHAR(10))+' UNION ALL SELECT TBL.childID ,TBL.parentID, CTE.depth + 1 , TBL.name FROM myTable AS TBL INNER JOIN CTE ON TBL.parentID = CTE.childID WHERE TBL.childID<>TBL.parentID ) SELECT childID,parentID,REPLICATE(''----'', depth) + name FROM CTE ORDER BY childID;' FROM myTable WHERE childID = parentID FOR XML PATH(''), TYPE).value('text()[1]', 'NVARCHAR(MAX)'); EXEC sp_executesql @SQL;
Update:
As suggested by Bogdan Sahlei, we can minimize compilation by making a parameterized actual query.
DECLARE @SQL1 NVARCHAR(MAX) = 'WITH CTE AS ( SELECT childID ,parentID, 0 AS depth,name FROM myTable WHERE childID = parentID AND childID = @childID UNION ALL SELECT TBL.childID ,TBL.parentID, CTE.depth + 1 , TBL.name FROM myTable AS TBL INNER JOIN CTE ON TBL.parentID = CTE.childID WHERE TBL.childID<>TBL.parentID ) SELECT childID,parentID,REPLICATE(''----'', depth) + name FROM CTE ORDER BY childID;' DECLARE @SQL2 NVARCHAR(MAX) = (SELECT 'exec sp_executesql @SQL, N''@childID int'', '+CAST(childID AS NVARCHAR(10))+';' FROM myTable WHERE childID = parentID FOR XML PATH(''), TYPE).value('text()[1]', 'NVARCHAR(MAX)'); EXEC sp_executesql @SQL2, N'@SQL NVARCHAR(MAX)', @SQL1;
source share