尽管已经定义了公共表达式(CTE),但仍然出现“无效对象名称”错误。

12
我正在使用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插入到一个表中,该表的模式已经定义并与CTEs的模式匹配。
INSERT INTO MyTable SELECT * FROM X_CTE
INSERT INTO MyTable SELECT * FROM Y_CTE
INSERT INTO MyTable SELECT * FROM Z_CTE

我在三个“INSERT INTO”语句中的CTEs中遇到了“无效对象名称”的错误。实际上,我在“SELECT”语句中也遇到了相同的错误。
SELECT * FROM X_CTE
SELECT * FROM Y_CTE
SELECT * FROM Z_CTE

请您指出这里有什么问题吗?
谢谢。
- Rohan.
3个回答

17

通用表达式(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

12

CTE仅定义一个查询。您需要为三个selectinsert重复它们:

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;

那是错误的,戈登。不使用CTE并非错误。 - N8allan
1
@N8allan……我已经删除了这个注释。我认为这是在 SQL Server 2005 中首次引入 CTE 时的情况。 - Gordon Linoff

1
也许你只是选择并运行了选择语句,你需要运行所有的选择语句和CTE语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接