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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |