当前位置: 首页 > 面试题库 >

MERGE / INSERT / DELETE SQL命令中有多个OUTPUT子句?

林星阑
2023-03-14
问题内容

我有一个T-SQL脚本,该脚本OUTPUTMERGEs和INSERTs中使用子句实现一些同步逻辑

现在,我在上面添加了一个日志记录层,我想添加第二个OUTPUT子句以将值写入报告表中。

我可以在语句中添加第二个OUTPUT子句MERGE

MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code) 
WHEN MATCHED AND T.IsDeleted = 0x0
    THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action, inserted.Name, inserted.Code;

这可行,但是只要我尝试添加目标

INTO @report_table;

我之前收到以下错误消息INTO

A MERGE statement must be terminated by a semicolon (;)

我在这里找到了类似的问题,但是它并没有进一步帮助我,因为我要插入的字段在两个表之间并不重叠,并且我也不想修改工作同步逻辑(如果可能)。

更新:

马丁·史密斯(MartinSmith)回答之后,我有了另一个主意,并重新编写了如下查询:

INSERT INTO @report_table (action, name, code)
SELECT M.Action, M.Name, M.Code
FROM
(
MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code) 
WHEN MATCHED AND T.IsDeleted = 0x0
    THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action as Action, inserted.Name, inserted.Code
) M

不幸的是,这种方法也不起作用,在运行时将输出以下错误消息:

An OUTPUT INTO clause is not allowed in a nested INSERT, UPDATE, DELETE, or MERGE statement.

因此,绝对不可能OUTPUT在单个DML语句中具有多个子句。


问题答案:

不可能。参见语法。

合并语句具有

[ <output_clause> ]

方括号显示它可以具有可选的输出子句。那个的语法是

<output_clause>::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
        [ (column_list) ] ]
    [ OUTPUT <dml_select_list> ]
}

此子句可以同时具有anOUTPUT INTO和an,OUTPUT但不能同时具有两个。

如果允许多个,则语法将具有 [ ,...n ]



 类似资料:
  • 主要内容:描述,示例命令用于将两个或两个以上的开发历史加入(合并)一起。 使用语法 描述 将来自命名提交的更改(从其历史从当前分支转移到当前分支之后)。 该命令由用于合并来自另一个存储库的更改,可以手动使用将更改从一个分支合并到另一个分支。 示例 以下是一些示例 - 示例-1 合并分支和在当前分支的顶部,使它们合并: 示例-2 合并分支到当前分支,使用合并策略: 示例-3 将分支合并到当前分支中,但不要自动进行新的提

  • 问题内容: 我试图弄清楚如何使用argparser执行以下操作: 本身是一个子命令。我的目标是使脚本具有链接一系列子命令(成为其中一个命令)并按顺序执行它们的能力。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。如何使用argparse完成此操作?我尝试了以下方法: 但是,似乎每次执行此操作时,它都会进入子命令并报告它不知道是什么。我尝试解析额外的内容,以便可以执行重复调用/链,但是

  • 问题内容: 如果我在bash中运行,结果将是两个命令都运行。但是,如果我使用子进程,则将运行第一个命令,打印出该行其余部分的全部内容。下面的代码回显而不是,我如何才能运行两个命令? 问题答案: 您必须在子进程中使用shell = True,而不能使用shlex.split: 返回:

  • 本文向大家介绍我们如何在MySQL INSERT INTO命令中使用WHERE子句?,包括了我们如何在MySQL INSERT INTO命令中使用WHERE子句?的使用技巧和注意事项,需要的朋友参考一下 在插入新行的情况下,我们可以在INSERT INTO命令中使用条件插入,即WHERE子句。可以通过以下方式完成- 借助虚拟表 在这种情况下,我们将插入虚拟表中的值以及一些条件。语法可以如下- 示例

  • 我正在编写一个脚本,它查询一些设备并将数据写入PostgreSQL数据库。

  • 我正在尝试用docker容器中的一个表建立一个数据库。为了正确运行数据库,我需要运行以下命令: bash:--:无效选项db_1用法:bash[GNU long option][option]... db_1 bash[GNU long option][option]脚本-文件... db_1 GNU long options: db_1--debugg db_1--debugger\ 如果“ba