gpt4 book ai didi

sql-server - SSIS::如何在不使用 SCD 向导的情况下在 SSIS 中实现 SCD 类型 2。当传入数据集对同一业务 key 有多个记录时

转载 作者:行者123 更新时间:2023-12-05 07:23:17 25 4
gpt4 key购买 nike

在 SSIS 中,如果传入的数据集对同一个业务 key 有多个记录,我如何在不使用 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,无论目标表中的记录是否具有该业务键已经?

谢谢。

最佳答案

好的,这是一个巨大的简化,因为 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 目标。但是,您需要小心禁止更新记录的 ExistingEffectiveEndDate 值停用日期。

关于sql-server - SSIS::如何在不使用 SCD 向导的情况下在 SSIS 中实现 SCD 类型 2。当传入数据集对同一业务 key 有多个记录时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56071054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com