小编典典

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

sql

我有一个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语句中具有多个子句。


阅读 207

收藏
2021-05-05

共1个答案

小编典典

不可能。参见语法

合并语句具有

[ <output_clause> ]

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

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

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

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

2021-05-05