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 (
...
)
,
The CTE's are defined only for one query. You would need to repeat them for the three select
s or insert
s:
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;
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