Я хочу сохранить клон определенной таблицы (sourcedb..sourcetable) в другой базе данных (имя таблицы там: targettable) для целей olap.Поскольку это касается всех трех операторов вставки, удаления и обновления, я решил использовать оператор MERGE.Ключевой мыслью здесь является передача данных только на основе столбца версии строк исходной таблицы.Помня, что целевая таблица имеет те же поля, что и исходное (плюс еще несколько), PK в тех же полях и все типы данных одинаковые (за исключением столбца rowversion, который будет двоичным (8), так как это будетзначение строки в исходной таблице и, следовательно, не в самой строке), я придумал следующее:
WITH live as
(
select *
from sourcedb..sourcetable
where 1=1
and (........) -- We don't want rows from the source table that don't meet these criteria
)
MERGE
INTO targettable as olap
USING live
ON olap.PKfield1=live.PKfield1 and olap.PKfield2=live.PKfield2 and .. -- join on all PK fields
WHEN MATCHED AND live.rowversioncol > olap.rowversioncol then update set
field1 = live.field1,
field2 = live.field2,
(...all NON-PK fields....)
WHEN NOT MATCHED BY TARGET THEN
INSERT (field1,field2,....(all fields)......)
VALUES (field1,field2,....(all fields)......)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
Можете ли вы подтвердить, что выполнение этого запроса точно гарантирует, что целевая таблица имеет те же данныеисходная таблица (отфильтрованные строки удалены)?