Save output of a CTE query to a temp table

Hursh 191 Reputation points
2022-07-24T20:35:00.167+00:00

How do I save the output of this query to a temp table?

;WITH CTE1 AS
(
SELECT ID,CustNum,OrderNumber,Value, Description
,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Value)AS [Counter]
FROM @test CROSS APPLY STRING_SPLIT(OrderNumber,'-')
),CTE2 AS
(
SELECT ID,CustNum,OrderNumber,Value,[Counter],Value AS Result, Description
FROM CTE1 WHERE [Counter] = 1
UNION ALL
SELECT C1.ID,C1.CustNum,C1.OrderNumber,C1.value,C1.[Counter],C2.Result+'-'+C1.value, C1.Description
FROM CTE1 C1 JOIN CTE2 C2 ON C1.ID = C2.ID AND C1.[Counter] = C2.[Counter] + 1
)
SELECT ID,CustNum,OrderNumber,[Counter],Value,Result
,LAG(Result)OVER(PARTITION BY ID ORDER BY [Counter])AS Misc
,CASE WHEN [Counter]=4 THEN 'NA' ELSE '' END AS Col1
,CASE WHEN [Counter]=2 THEN 'None' ELSE '' END AS Col2
,Description
FROM CTE2

--- DDL
DECLARE @test TABLE (ID INT PRIMARY KEY, CustNum INT, OrderNumber VARCHAR(MAX), Description VARCHAR(50));
INSERT @test VALUES
(9001, 1234, '11111-22222-33333-444444', 'Test1'),
(9002, 5678, '55555-66666-77777-888888', 'Test2');

Developer technologies Transact-SQL
{count} vote

7 answers

Sort by: Most helpful
  1. Erland Sommarskog 121.4K Reputation points MVP Volunteer Moderator
    2022-07-24T21:56:32.667+00:00
       WITH  CTE1 AS (  
          ...  
       ). CTE2 AS (  
          ...  
       )  
       INSERT #temp(...)  
          SELECT ...  
          FROM  CTE2  
    
    2 people found this answer helpful.

  2. Jingyang Li 5,896 Reputation points Volunteer Moderator
    2022-07-25T01:16:00.207+00:00

    You can:
    SELECT * INTO #NewTable FROM cteTemp

    1 person found this answer helpful.
    0 comments No comments

  3. LiHong-MSFT 10,056 Reputation points
    2022-07-25T01:22:51.913+00:00

    Hi @Hursh
    You could put the Select ...CASE WHEN ... into another CTE, like this:

    DECLARE @test TABLE (ID INT PRIMARY KEY, CustNum INT, OrderNumber VARCHAR(MAX), Description VARCHAR(50));  
    INSERT @test VALUES  
    (9001, 1234, '11111-22222-33333-444444', 'Test1'),  
    (9002, 5678, '55555-66666-77777-888888', 'Test2');  
    ;WITH CTE1 AS  
    (  
    SELECT ID,CustNum,OrderNumber,Value, Description  
    ,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Value)AS [Counter]  
    FROM @test CROSS APPLY STRING_SPLIT(OrderNumber,'-')  
    ),CTE2 AS  
    (  
    SELECT ID,CustNum,OrderNumber,Value,[Counter],Value AS Result, Description  
    FROM CTE1 WHERE [Counter] = 1  
    UNION ALL  
    SELECT C1.ID,C1.CustNum,C1.OrderNumber,C1.value,C1.[Counter],C2.Result+'-'+C1.value, C1.Description  
    FROM CTE1 C1 JOIN CTE2 C2 ON C1.ID = C2.ID AND C1.[Counter] = C2.[Counter] + 1  
    ),CTE3 AS  
    (  
    SELECT ID,CustNum,OrderNumber,[Counter],Value,Result  
    ,LAG(Result)OVER(PARTITION BY ID ORDER BY [Counter])AS Misc  
    ,CASE WHEN [Counter]=4 THEN 'NA' ELSE '' END AS Col1  
    ,CASE WHEN [Counter]=2 THEN 'None' ELSE '' END AS Col2  
    ,Description  
    FROM CTE2  
    )  
    SELECT * INTO #TEMP FROM CTE3  
      
    SELECT * FROM #TEMP  
    

    Best regards,
    LiHong

    1 person found this answer helpful.
    0 comments No comments

  4. Khalil Kazi 1 Reputation point
    2022-07-25T11:57:37.237+00:00

    ;WITH CTE1 AS
    (
    SELECT ID,CustNum,OrderNumber,Value, Description
    ,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Value)AS [Counter]
    FROM @test CROSS APPLY STRING_SPLIT(OrderNumber,'-')
    ),CTE2 AS
    (
    SELECT ID,CustNum,OrderNumber,Value,[Counter],Value AS Result, Description
    FROM CTE1 WHERE [Counter] = 1
    UNION ALL
    SELECT C1.ID,C1.CustNum,C1.OrderNumber,C1.value,C1.[Counter],C2.Result+'-'+C1.value, C1.Description
    FROM CTE1 C1 JOIN CTE2 C2 ON C1.ID = C2.ID AND C1.[Counter] = C2.[Counter] + 1
    )
    SELECT ID,CustNum,OrderNumber,[Counter],Value,Result
    ,LAG(Result)OVER(PARTITION BY ID ORDER BY [Counter])AS Misc
    ,CASE WHEN [Counter]=4 THEN 'NA' ELSE '' END AS Col1
    ,CASE WHEN [Counter]=2 THEN 'None' ELSE '' END AS Col2
    ,Description
    INTO #TempTable
    FROM CTE2

    0 comments No comments

  5. Khalil Kazi 1 Reputation point
    2022-07-25T11:58:32.007+00:00

    ;WITH CTE1 AS
    (
    SELECT ID,CustNum,OrderNumber,Value, Description
    ,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Value)AS [Counter]
    FROM @test CROSS APPLY STRING_SPLIT(OrderNumber,'-')
    ),CTE2 AS
    (
    SELECT ID,CustNum,OrderNumber,Value,[Counter],Value AS Result, Description
    FROM CTE1 WHERE [Counter] = 1
    UNION ALL
    SELECT C1.ID,C1.CustNum,C1.OrderNumber,C1.value,C1.[Counter],C2.Result+'-'+C1.value, C1.Description
    FROM CTE1 C1 JOIN CTE2 C2 ON C1.ID = C2.ID AND C1.[Counter] = C2.[Counter] + 1
    )
    SELECT ID,CustNum,OrderNumber,[Counter],Value,Result
    ,LAG(Result)OVER(PARTITION BY ID ORDER BY [Counter])AS Misc
    ,CASE WHEN [Counter]=4 THEN 'NA' ELSE '' END AS Col1
    ,CASE WHEN [Counter]=2 THEN 'None' ELSE '' END AS Col2
    ,Description
    into #temp
    FROM CTE2

    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.