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

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

在 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/

相关文章:

python - 如何创建一个 SSIS 包以从 Python REST API 请求 ETL JSON 到 MSSQL 服务器?

c# - 从两个 where 条件返回 SQL 值以在 C# 中显示

sql - 如何根据多个字段选择不同的行

ssis - SSIS:OnPostExecute OnError问题

sql-server - SSIS 2005 OnError处理程序

sql-server - SSAS - 如何在不丢失数据的情况下执行部分多维数据集处理

sql-server - 根据 is null 查询的结果将列更新为 BIT 值

SQL Server比较机制

sql - ssis中的环境变量配置是什么,ssis中的注册表项配置是什么

ssis - 如何使用ssis将文件上传到一个驱动器?