我有一个T-SQL脚本,该脚本OUTPUT在MERGEs和INSERTs中使用子句实现一些同步逻辑。
T-SQL
OUTPUT
MERGE
INSERT
现在,我在上面添加了一个日志记录层,我想添加第二个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:
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但不能同时具有两个。
OUTPUT INTO
如果允许多个,则语法将具有 [ ,...n ]
[ ,...n ]