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

时间:2013-12-18 01:27:14

标签: 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 (
    ...
)

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

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

我在三个INSERT INTO语句中收到CTE的“无效对象名称”错误。实际上,我在SELECT语句中遇到了相同的错误:

SELECT * FROM X_CTE
SELECT * FROM Y_CTE
SELECT * FROM Z_CTE

请指出这里有什么问题?

由于

-Rohan。

3 个答案:

答案 0 :(得分: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

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

INSERT INTO MyTable (A,B,C,D)
SELECT * FROM X_CTE
UNION ALL
SELECT * FROM Y_CTE
UNION ALL
SELECT * FROM Z_CTE

答案 1 :(得分:4)

CTE仅针对一个查询进行定义。您需要为三个selectinsert 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;

答案 2 :(得分:0)

也许你只是在选择和运行 select 语句,你需要运行 all,select 和 cte 语句。