SSIS :: Как реализовать SCD типа 2 в SSIS без использования мастера SCD.Когда входящий набор данных имеет несколько записей для одного и того же бизнес-ключа - PullRequest
2 голосов
/ 10 мая 2019

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

Пример набора данных

Customer ID   Name      Segment     Postal Code
1             James     Corporate   50026
2             Andrew    Consumer    33311
3             Steven    Consumer    90025
2             Andrew    Consumer    33306
3             Steven    Consumer    90032
1             James     Corporate   50087
3             Steven    Consumer    90000

В моем случае, если я попытаюсь загрузить таблицу измерений с другими компонентами служб SSIS (поиск / условное разделение), все записи отобразят новую строку в таблице, поскольку все они поступают одновременно.

У меня есть CurrentFlag в качестве индикатора текущей записи.

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

Спасибо.

1 Ответ

0 голосов
/ 10 мая 2019

ОК, это огромное упрощение, потому что 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 записи обновления, которое деактивирует дату.

...