3

在 SSIS 中,如果传入数据集具有相同业务键的多条记录,如何在不使用 SCD 向导的情况下将其加载到具有 SCD 类型 2 的维度表中。

样本数据集

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,无论目标表中的记录是否已经具有该业务密钥?

谢谢。

4

1 回答 1

0

好的,这是一个巨大的简化,因为正确实施 SCD 非常具有挑战性。你需要坐下来批判性地思考这个问题。我在下面的回答只处理正在进行的日常处理 - 它没有解释如何处理正在重新处理的历史文件,这可能会导致具有不同有效开始和结束日期的重复记录。

根据定义,您将拥有一个现有的记录源组件(即,从数据库表中查询)和一个传入数据源组件(即,*.csv 平面文件)。您将需要执行合并联接以识别新记录与现有记录。对于现有记录,您需要确定是否有任何列已更改(在派生列转换中执行此操作)。

您还需要为 EffectiveStartDate 和 EffectiveEndDate 包括两列。

IncomingEffectiveStartDate = FileDate
IncomingEffectiveEndDate = 12-31-9999
ExistingEffectiveEndDate = FileDate - 1

注意 12-31-9999:这实际上是 Y10K 错误。但是,它允许用户在日期范围之间查询数据库,而无需在查询的 WHERE 子句中有意添加 ISNULL(GETDATE()),以防他们在日期范围之间进行查询。

这将防止列上的日期重叠,这可能会导致返回给定日期的多条记录。

要确定记录是否已更改,请创建一个名为 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 值,该值会停用日期。

于 2019-05-10T16:02:48.393 回答