我正在使用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。
答案 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仅针对一个查询进行定义。您需要为三个select
或insert
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 语句。