Reputation: 91
I want to rewrite the Recursive CTE to while loop in SQL Server.
How can I rewrite? Sample Query is in the below.
WITH CTE
AS (
SELECT DISTINCT
ID,
[NAME],
ID AS PARENTID,
ITEMTYPE,
COST
FROM TABLE1
UNION ALL
SELECT T.ID,
C.[NAME],
C.ID AS PARENTID,
T.ITEMTYPE,
T.COST
FROM CTE AS C
INNER JOIN TABLE1 T ON C.ID = T.ID
WHERE C.ITEMTYPE <> 'individual')
SELECT *
FROM CTE;
Upvotes: 1
Views: 5213
Reputation: 2021
You need something like this. Not very sure why you need the loop though.
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
IF OBJECT_ID('tempdb..#tempFinal') IS NOT NULL
DROP TABLE #tempFinal
SELECT DISTINCT
ID,
[NAME],
ID AS PARENTID,
ITEMTYPE,
COST
INTO #temp
FROM TABLE1
DECLARE @ID as INT
WHILE EXISTS ( SELECT TOP 1 1 FROM #temp )
BEGIN
SELECT TOP 1 @ID = ID FROM #temp
SELECT T.ID,
C.[NAME],
C.ID AS PARENTID,
T.ITEMTYPE,
T.COST
INTO #tempFinal
FROM #temp AS C
INNER JOIN TABLE1 T ON C.ID = T.ID
WHERE C.ITEMTYPE <> 'individual' AND T.ID = @ID
DELETE FROM #temp WHERE ID = @ID
END
SELECT * FROM #tempFinal
Upvotes: 0
Reputation: 453648
The rewrite is quite simple.
DECLARE @LoopCount INT = 0;
SELECT DISTINCT
ID,
[NAME],
ID AS PARENTID,
ITEMTYPE,
COST
INTO #CTE
FROM TABLE1
WHILE @@ROWCOUNT > 0 AND @LoopCount < 100
BEGIN
INSERT INTO #CTE
SELECT T.ID,
C.[NAME],
C.ID AS PARENTID,
T.ITEMTYPE,
T.COST
FROM #CTE AS C
INNER JOIN TABLE1 T ON C.ID = T.ID
WHERE C.ITEMTYPE <> 'individual';
SET @LoopCount += 1;
END;
IF @LoopCount = 100
THROW 50000, 'Max recursion limit exceeded', 0
SELECT *
FROM #CTE
Upvotes: 2