我有一个脚本,它使用s 和s中的子句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
:
A MERGE statement must be terminated by a semicolon (;)
我在这里找到了一个类似的问题,但它并没有进一步帮助我,因为我要插入的字段不会在两个表之间重叠,而且我不想修改工作同步逻辑(如果可能的话)。
更新:
在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.Name, inserted.Code
) M
不幸的是,这种方法也不起作用,在运行时会输出以下错误消息:
An OUTPUT INTO clause is not allowed in a nested INSERT, UPDATE, DELETE, or MERGE statement.
因此,绝对没有办法OUTPUT
在单个 DML 语句中包含多个子句。