在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已经?
谢谢。
答案 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值。