Чтобы 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.