ОК, это огромное упрощение, потому что SCD очень сложно правильно реализовать. Вам нужно будет сесть и критически подумать об этом. Мой ответ ниже касается только текущей ежедневной обработки - он не объясняет, как обрабатывать хронологические файлы, которые подвергаются повторной обработке, что может привести к дублированию записей с различными датами EffectiveStart и End.
По определению у вас будет существующий компонент источника записей (то есть запрос из таблицы базы данных) и компонент источника входящих данных (то есть плоский файл * .csv). Вам необходимо выполнить объединение слиянием, чтобы определить новые записи по сравнению с существующими записями. Для существующих записей вам необходимо определить, изменился ли какой-либо из столбцов (выполните это в преобразовании «Производный столбец»).
Вам также нужно будет включить два столбца для EffectiveStartDate и EffectiveEndDate.
IncomingEffectiveStartDate = FileDate
IncomingEffectiveEndDate = 12-31-9999
ExistingEffectiveEndDate = FileDate - 1
Примечание на 12-31-9999: Это, по сути, ошибка Y10K. Но он позволяет пользователям запрашивать базу данных между диапазонами дат без необходимости сознательно добавлять ISNULL (GETDATE ()) в предложение WHERE запроса в случае запроса между диапазонами дат.
Это предотвратит перекрытие дат в столбцах, что может привести к возвращению нескольких записей за данную дату.
Чтобы определить, изменилась ли запись, создайте новый столбец с именем RecordChangedInd типа Bit.
(ISNULL(ExistingColumn1, 0) != ISNULL(IncomingColumn1, 0) ||
ISNULL(ExistingColumn2, 0) != ISNULL(IncomingColumn2, 0) ||
....
ISNULL(ExistingColumn_N, 0) != ISNULL(IncomingColumn_N, 0) ? 1 : 0)
Затем в состоянии разделения вы можете создать два выхода: RecordHasChanged
(это будет INSERT) и RecordHasNotChanged
(это будет UPDATE для деактивации выходной записи и INSERT).
Можно предположительно направить оба входа в один и тот же пункт INSERT. Но вам нужно быть осторожным, подавляя значение ExistingEffectiveEndDate записи обновления, которое деактивирует дату.