'Invalid object name' error for Common Table [removed]CTE) even though CTE has been defined

后端 未结 2 1217
终归单人心
终归单人心 2021-01-18 13:56

I am using SQL server 2012. I have three CTEs defined in a row as shown below:

;WITH X_CTE (A, B, C, D)
AS (
    ...
)
,
Y_CTE (A, B, C, D)
AS (
    ...
)
,
         


        
相关标签:
2条回答
  • 2021-01-18 14:26

    The CTE's are defined only for one query. You would need to repeat them for the three selects or inserts:

    with X_CTE . . .
    INSERT INTO MyTable SELECT * FROM X_CTE;
    
    with X_CTE . . .
    INSERT INTO MyTable SELECT * FROM Y_CTE;
    
    with X_CTE . . .
    INSERT INTO MyTable SELECT * FROM Z_CTE;
    
    0 讨论(0)
  • 2021-01-18 14:41

    CTEs are only defined for one statement that follows them. Three INSERT statements are - well - more than one statement.

    Since all of the inserts are to the same table, you can do a UNION ALL to gather all of the rows into a single INSERT statement:

    INSERT INTO MyTable
    SELECT * FROM X_CTE
    UNION ALL
    SELECT * FROM Y_CTE
    UNION ALL
    SELECT * FROM Z_CTE
    

    But I'd also change the above to use explicit column lists - you don't want this query breaking if more columns are added to MyTable later:

    INSERT INTO MyTable (A,B,C,D)
    SELECT * FROM X_CTE
    UNION ALL
    SELECT * FROM Y_CTE
    UNION ALL
    SELECT * FROM Z_CTE
    
    0 讨论(0)
提交回复
热议问题