SQL Server - 在INSERT语句中使用WITH子句

时间:2013-03-22 15:37:58

标签: sql sql-server

我想知道这是否可行。我有一个使用WITH子句的现有查询将一些聚合数据应用于SELECT查询,如下所示:(大规模简化)

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

我现在希望INSERT将此查询的结果放入另一个表中。

我尝试了以下内容:

INSERT INTO tablea(a,b)
;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

但是我收到了错误:

  

';'附近的语法不正确。

所以我尝试了没有分号,但得到了错误:

  

关键字“WITH”附近的语法不正确。

     

关键字'with'附近的语法不正确。如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句。

我尝试用不同的语法做什么?

3 个答案:

答案 0 :(得分:56)

您需要在INSERT INTO之后放置CTE。所以代码将是:

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
INSERT INTO tablea(a,b)
SELECT y, z 
FROM alias

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

不使用CTE的另一种方法是将其包装在子查询中,

INSERT INTO tablea(a,b)
SELECT y, z 
FROM 
(
    SELECT y,z FROM tableb
) alias

答案 2 :(得分:0)

分号用于终止语句。因此,当您使用; WITH时,终止前一个语句。但是,这不是你在这里得到错误的原因。这里的问题是你的INSERT INTO语句,它正在寻找VALUES或SELECT语法。

INSERT INTO语句可以通过两种方式使用 - 通过显式提供VALUES或使用SELECT语句提供结果集。