1

У меня есть запрос MERGE для обновления данных. В случае несоответствия я вставляю записи в источник, получая вывод во временную таблицу.Слияние SQL-серверов - Получение сопоставленных записей в другую временную таблицу

Можно ли получить совпадающие записи на временную таблицу? В принципе, чтобы избежать дублирования данных в дальнейшей обработке, мне нужно иметь копию согласованных записей.

Это моя MERGE команда:

MERGE Product.ProductHeaderRepository AS t 
USING (SELECT GETDATE() as d, c1, c2, c3, 
Name FROM Supplier.ProductHeaderImport 
WHERE (BatchID = @BatchID)) AS s 
ON dbo.GetProductHeaderId(s.c1,S.c2,S.c3) <0 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Name, c1,c2,c3) VALUES (Name, c2,c2,c3) 
OUTPUT INSERTED.iD, s.c1, s.c2, s.c3 INTO @TmpTable; 
+1

Попробуйте добавить '$ actio n' в вашу 'OUTPUT' и временную таблицу. Я думаю, что он уже делает то, что вы хотите. – HABO

ответ

9

Вы можете создать пункт MATCHED, что ничего не меняется, а просто обновляет переменную, например,

DECLARE @T1 TABLE (A INT, B INT); 
DECLARE @T2 TABLE (A INT, B INT); 
DECLARE @T3 TABLE (Action VARCHAR(20), A INT, B INT); 

INSERT @T1 VALUES (1, 1), (2, 2), (3, 3); 
INSERT @T2 VALUES (1, 0), (2, NULL), (4, 0); 

DECLARE @I INT; -- VARIABLE TO UPDATE 

MERGE @T2 B 
USING @T1 A 
    ON A.A = B.A 
WHEN MATCHED THEN 
    UPDATE SET @I = 1 -- DO NOTHING MEANINGFUL IN THE UPDATE; 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (A, B) VALUES (A.A, A.B) 
OUTPUT $action, ISNULL(inserted.A, deleted.A), ISNULL(inserted.B, deleted.B) INTO @T3; 

SELECT * 
FROM @T3; 

Вернется:

Action A B 
INSERT 3 3 
UPDATE 1 0 
UPDATE 2 NULL 

Так что, если вы добавляете новый столбец @TmpTable сохранить действие, которое вы можете получить ваши совпавшие строки с помощью:

SELECT * 
FROM @TmpTable 
WHERE Action = 'UPDATE'; 

И ваши новые строки, используя :

SELECT * 
FROM @TmpTable 
WHERE Action = 'INSERT'; 
+0

Обратите внимание, что условия соединения должны быть в скобках 'ON()' –

+0

@benrhoumamoez Это совсем не так. Вопрос содержит полный пример, который отлично работает без круглых скобок. – GarethD

Смежные вопросы