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、UPDATE、DELETE、SELECT 语句的速率?