即使已定义 CTE,公共表表达式 (CTE) 也会出现“对象名称无效”错误

问题描述 投票:0回答:4

我使用的是 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

请您指出这里有什么问题吗?

谢谢

-罗汉。

sql sql-server common-table-expression
4个回答
17
投票

CTE 仅为其后的one 语句定义。三个

INSERT
陈述 - 嗯 - 不止一个陈述。

由于所有插入都针对同一个表,因此您可以执行

UNION ALL
将所有行收集到单个
INSERT
语句中:

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

但我也会更改上面的内容以使用显式列列表 - 如果稍后将更多列添加到 MyTable,您不希望

this
查询中断:

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 仅为一个查询定义。您需要对三个

select
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;

1
投票

也许您只是选择并运行 select 语句,您需要运行所有 select 和 cte 语句。


0
投票

首次执行包含 CTE 的 SQL 函数时遇到同样的问题。每次运行后我都能复制错误:

DBCC FREESYSTEMCACHE(N'ALL');

解决办法很简单,重新编译函数即可:

exec sp_refreshsqlmodule '<function-name>';
© www.soinside.com 2019 - 2024. All rights reserved.