Как предотвратить слияние SQL Server с использованием OUTPUT от обновления целевой таблицы - PullRequest
0 голосов
/ 01 ноября 2019

Я знаю, как обновить целевую таблицу из исходной таблицы с помощью оператора MERGE сервера SQL. Я знаю, что могу зафиксировать изменения с помощью оператора OUTPUT.

Проблема: при использовании оператора вывода для захвата изменений они все еще применяются к целевой таблице.

Вопрос: Как я могу запретить оператору MERGE обновлять цель и захватывать только выходные данные?

Дополнительная информация. Цель в этом случае - не проводить аудит, что является распространенным использованием оператора OUTPUT в MERGE. Цель состоит в том, чтобы определить изменения и затем выполнить дальнейшую обработку для них, которые не могут быть добавлены к объединению. Вы также можете назвать это, выполняя Dry-Run.

1 Ответ

0 голосов
/ 01 ноября 2019

Чтобы MERGE мог что-либо выдавать как часть предложения OUTPUT, он должен выполнить UPDATE или INSERT.

Вдобавок ко всему, я вижу два способа выполнить то, что вы хотите:

Один: написать некоторый SQL для захвата набора данных, который подается в оператор MERGE, и использовать его длявыяснить, что MERGE будет делать. Я знаю, что не очень хорошо объяснил это, поэтому вот пример с псевдокодом.

SELECT
    s.*
    ,d.PrimaryKey
INTO
    #SourceForMerge
FROM
    [Source] AS s
    LEFT OUTER JOIN [Destination] AS d
        ON s.MatchingColumnA = d.MatchingColumnA
        AND s.MatchingColumnB = d.MatchingColumnB

;MERGE [Destination] AS d
USING
(
    SELECT * FROM #SourceForMerge
) AS s
ON
    d.PrimaryKey = s.PrimaryKey
WHEN MATCHED THEN
    -- UPDATE columns
WHEN NOT MATCHED THEN
    -- INSERT columns
OUTPUT
    -- columns
INTO
    #OutputTempTable

Это позволит вам опросить временную таблицу #SourceForMerge, чтобы увидеть, что соответствует, а что нет.

В качестве альтернативы, вы можете быть вне закона и заключить MERGE в транзакцию, захватить ВЫХОД, ВЫБЕРИТЕ его где-нибудь, а затем преднамеренно откатитесь, чтобы "отменить" изменения.

Это кажется мне наиболееточный метод, но немного пугающий.

Когда я тестирую некоторый SQL, я часто делаю это, оборачивая что-то в транзакцию, а затем получая что-то вроде:

SELECT 1 / 0

ввызвать ROLLBACK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...