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

Posted

技术标签:

【中文标题】SQL Server - 在 INSERT 语句中使用 WITH 子句【英文标题】:SQL Server - using the WITH clause in an INSERT statement 【发布时间】:2013-03-12 13:00:41 【问题描述】:

我想知道这是否可能。我有一个现有查询,它使用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 子句,则前面的语句必须以分号结束。

我试图用不同的语法来做可能吗?

【问题讨论】:

分号位于语句的结尾。把它放在前面是一个坏习惯,你应该习惯用分号正确地结束每个语句。 您是否检查了documentation 中的INSERT 语句?它表明 CTE 位于 INSERT 之前,并包含一个使用 CTE 的示例。 【参考方案1】:

您需要将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

【讨论】:

【参考方案2】:

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

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

【讨论】:

@KSTech 好问题。我在想 OP 只是在简化问题。【参考方案3】:

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

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

【讨论】:

以上是关于SQL Server - 在 INSERT 语句中使用 WITH 子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 基本INSERT语句

sql server 用INSERT语句添加数据时 语句中若有中文或英文字母 执行时就报错 是怎么回事?

如何获取 SQL Server 中 INSERT、UPDATE、DELETE、SELECT 语句的速率?

SQL Server 动态生成数据库所有表Insert语句

SQL Server 中SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

SQL SERVER 中,after insert触发器是啥意思,应该如何使用?