【问题标题】:SQL Server - using the WITH clause in an INSERT statementSQL Server - 在 INSERT 语句中使用 WITH 子句
【发布时间】: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 的示例。

标签: sql sql-server common-table-expression with-clause


【解决方案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 语句提供结果集。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多