加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – MERGE / INSERT / DELETE SQL命令中有多个OUTPUT

发布时间:2020-12-12 16:55:34 所属栏目:MsSql教程 来源:网络整理
导读:我有一个T-SQL脚本,在MERGE和INSERT中使用OUTPUT子句实现一些同步逻辑. 现在我正在添加一个日志记录层,我想添加一个第二个OUTPUT子句来将值写入报表. 我可以在我的MERGE语句中添加第二个OUTPUT子句: MERGE TABLE_TARGET AS TUSING TABLE_SOURCE AS SON (T.Co
我有一个T-SQL脚本,在MERGE和INSERT中使用OUTPUT子句实现一些同步逻辑.

现在我正在添加一个日志记录层,我想添加一个第二个OUTPUT子句来将值写入报表.

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

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 (;)

我发现了a similar question here,但是它没有帮助我进一步,因为我要插入的字段不会在两个表之间重叠,我不想修改工作同步逻辑(如果可能的话).

更新:

在Martin Smith的答案之后,我有另一个想法,并重写了我的查询如下:

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.Code
) M

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

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

所以,绝对没有办法在单个DML语句中有多个OUTPUT子句.

解决方法

不可能.见 grammar.

合并声明有

[ <output_clause> ]

方括号表示它可以有一个可选的输出子句.语法就是这样

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

此子句可以同时具有OUTPUT INTO和OUTPUT,但不能是两个.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读