У меня есть T-SQL
script, который реализует некоторую логику синхронизации, используя предложение OUTPUT
в MERGE
и INSERT
s.
Теперь я добавляю над ним уровень журналирования, и я хотел бы добавить второе предложение 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 (;)
Я нашел аналогичный вопрос здесь, но это не помогло мне дальше, потому что поля, которые я собираюсь вставить, не перекрываются между двумя таблицами, и я не нахожу Не хотите изменять рабочую синхронизацию (если это возможно).
UPDATE:
После ответа Мартин Смит у меня возникла другая идея и переписал мой запрос следующим образом:
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.