Дизайн для этого будет выглядеть следующим образом:
У вас будет 4 таблицы и 1 представление: Source, TMP_Dest (точно как источник без PK), CHG_Dest (для изменений, точно как пункт назначения без PK), Dest (будет иметь PK), FV_TMP_Dest (это в том случае, если место назначения отличается от источника - разные типы полей)
Пакет служб SSIS:
1.Используйте ExecuteSQLTask и обрежьте TMP_Dest, потому чтоэто просто временно для извлеченных данных
Используйте ExecuteSQlTask и обрезайте CHG_Dest, потому что это просто временно для извлеченных данных
Используйте один DataFlowTask для загрузки данных из источника в TMP_Dest
Определите две переменные OperationIDInsert = 1 и OperationIDUpdate = 2 (значения не важны, вы можете установить их по своему усмотрению) -> вы будете использовать их в точке 5. ниже
Использовать другую DataFlowTask, в которой вы будете иметь:
на левой стороне Источник OLE DB, в котором вы будете извлекать данные из представления, упорядоченного PK (не забудьтеt SortKeyPosition из расширенного редактора для полей PK)
на правой стороне источника OLE DB, в котором вы извлекаете данные из Dest, упорядоченного PK (не забудьте установить SortKeyPosition из расширенного редактора для PKполя)
LEFT JOIN между этим
на левой стороне («сторона вставки») у вас будет: производный столбец, в котором вы будете назначать в качестве выражения переменную OperationIDInsert И пункт назначения OLE DBдля вставки данных в таблицу CHG_Dest.Таким образом, вы вставите данные, которые должны быть вставлены в таблицу назначения, и вы это знаете, поскольку у вас есть столбец OperationIDInsert.
справа вы сделаете то же самое, но с использованием столбца OperationIDUpdate
Вы будете использовать ExecuteSQLTask в ControlFlow и будете иметь слияние SQL.На основе полей PK и полей OperationIDInsert / OperationIDUpdate вы либо вставите данные, либо обновите их.
Надеюсь, это поможет вам.Дайте мне знать, если вам нужна дополнительная информация.