"公用表表达式(CTE)"的"无效对象名称"错误,即使已定义CTE也是如此

Gig*_*han 5 sql sql-server

我正在使用SQL Server 2012.我连续定义了三个CTE,如下所示:

;WITH X_CTE (A, B, C, D)
AS (
    ...
)
,
Y_CTE (A, B, C, D)
AS (
    ...
)
,
Z_CTE (A, B, C, D)
AS (
    ...
)
Run Code Online (Sandbox Code Playgroud)

然后,我将这些CTE插入到一个表中,该表的模式已定义并与CTE的模式匹配

INSERT INTO MyTable SELECT * FROM X_CTE
INSERT INTO MyTable SELECT * FROM Y_CTE
INSERT INTO MyTable SELECT * FROM Z_CTE
Run Code Online (Sandbox Code Playgroud)

我在三个INSERT INTO语句中得到CTE的"无效对象名称"错误.事实上,我在SELECT语句中得到了同样的错误:

SELECT * FROM X_CTE
SELECT * FROM Y_CTE
SELECT * FROM Z_CTE
Run Code Online (Sandbox Code Playgroud)

你能指出这里有什么问题吗?

谢谢

-Rohan.

Dam*_*ver 7

CTE仅针对其后的一个语句定义.三个INSERT陈述 - 好 - 多于一个陈述.

由于所有插入都在同一个表中,因此您可以UNION ALL将所有行收集到一个INSERT语句中:

INSERT INTO MyTable
SELECT * FROM X_CTE
UNION ALL
SELECT * FROM Y_CTE
UNION ALL
SELECT * FROM Z_CTE
Run Code Online (Sandbox Code Playgroud)

但我还要更改上面的内容以使用显式列列表 - 如果以后添加更多列,则不希望查询中断MyTable:

INSERT INTO MyTable (A,B,C,D)
SELECT * FROM X_CTE
UNION ALL
SELECT * FROM Y_CTE
UNION ALL
SELECT * FROM Z_CTE
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

仅针对一个查询定义CTE。您需要为三个selects 重复它们insert

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;
Run Code Online (Sandbox Code Playgroud)