我使用的是 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
请您指出这里有什么问题吗?
谢谢
-罗汉。
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
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;
也许您只是选择并运行 select 语句,您需要运行所有 select 和 cte 语句。
首次执行包含 CTE 的 SQL 函数时遇到同样的问题。每次运行后我都能复制错误:
DBCC FREESYSTEMCACHE(N'ALL');
解决办法很简单,重新编译函数即可:
exec sp_refreshsqlmodule '<function-name>';