SSIS ::如何在不使用SCD向导的情况下在SSIS中实现SCD类型2。当传入数据集具有相同业务密钥的多个记录时

时间:2019-05-10 05:13:52

标签: sql-server ssis msbi scd type-2-dimension

在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已经?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

您还需要为“ EffectiveStartDate”和“ EffectiveEndDate”添加两列。

ClientError: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

关于12-31-9999的注释:这实际上是Y10K错误。但是,它允许用户在日期范围之间进行查询,而不必在日期范围之间进行查询的情况下有意识地在查询的WHERE子句中添加ISNULL(GETDATE())。

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

要确定记录是否已更改,请创建一个名为BitChange类型的名为RecordChangedInd的新列。

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

然后,在拆分状态下,您可以创建两个输出:(ISNULL(ExistingColumn1, 0) != ISNULL(IncomingColumn1, 0) || ISNULL(ExistingColumn2, 0) != ISNULL(IncomingColumn2, 0) || .... ISNULL(ExistingColumn_N, 0) != ISNULL(IncomingColumn_N, 0) ? 1 : 0) (这将是一个INSERT)和RecordHasChanged(这将是一个UPDATE以停用现有记录和INSERT)。

可以想象,您可以将两个输入都路由到同一个INSERT目标。但是,您将需要小心抑制取消激活日期的更新记录的ExistingEffectiveEndDate值。