需要帮助了解 SSIS 中 scd 的替代方案

Posted

技术标签:

【中文标题】需要帮助了解 SSIS 中 scd 的替代方案【英文标题】:Need help understanding alternatives to scd in SSIS 【发布时间】:2016-11-17 21:22:56 【问题描述】:

我正在从事一个数据仓库项目,该项目将涉及集成来自多个源系统的数据。我设置了一个 SSIS 包,用于填充客户维度并使用渐变维度工具来跟踪客户的更新。

我遇到了一些问题。举个例子:

源系统 A 可能有如下记录:

名字、姓氏、邮政编码 简,母鹿,14222

源系统 B 可能有同一个客户端的记录,如下所示:

名字、姓氏、邮政编码 Jane, Doe, 未知

如果我首先从系统 A 导入记录,我将拥有名字、姓氏和种族。伟大的。现在,如果我从系统B导入客户记录,我可以做模糊匹配识别这是同一个人,并使用渐变维度工具更新信息。但在这种情况下,我会丢失邮政编码,因为“未知”会覆盖有效数据。

我想知道我是否以错误的方式处理这个问题。 SCD 工具似乎没有提供任何根据新数据是否有效来选择性地更新属性的方法。合并语句会更好吗?我是否犯了一些我没有看到的基本设计错误?

感谢您的建议!

【问题讨论】:

【参考方案1】:

根据我的经验,内置的 SCD 工具不够灵活,无法满足这一要求。

两个MERGE 语句,或一系列UPDATEINSERT 语句可能会给您最大的逻辑和性能灵活性。

对于 SCD 类型 2,MERGE 语句可能有一些模型,但这是我使用的模式:

Merge Target
  Using Source
    On Target.Key = Source.Key

  When Matched And
    Target.NonKeyAttribute <> Source.NonKeyAttribute
    Or IsNull(Target.NonKeyNullableAttribute, '') <> IsNull(Source.NonKeyNullableAttribute, '')
  Then Update Set SCDEndDate = GetDate(), IsCurrent = 0

  When Not Matched By Target Then 
    Insert (Key, ... , SCDStartDate, IsCurrent)
    Values (Source.Key, ..., GetDate(), 1)

  When Not Matched By Source Then
    Update Set SCDEndDate = GetDate(), IsCurrent = 0;

Merge Target
  Using Source
    On Target.Key = Source.Key

  -- These will be the changing rows that were expired in first statement.
  When Not Matched By Target Then
    Insert (Key, ... , SCDStartDate, IsCurrent)
    Values (Source.Key, ... , GetDate(), 1);

【讨论】:

感谢您确认内置 SCD 工具的局限性。我有预感会是这样,但在我放弃目前的设计之前,我希望得到一些外界的确认。

以上是关于需要帮助了解 SSIS 中 scd 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

SQL SSIS 使用派生列转换来处理空数据.. 替代方案?

需要 SSIS 的帮助

前端开发需要了解的工具集合:webpack, eslint, prettier, ...

前端进阶 - 前端开发需要了解的工具集合:webpack, eslint, prettier, ...

前端进阶 - 前端开发需要了解的工具集合:webpack, eslint, prettier, ...

SQL Server scd2 和 scd1 中的 DWH SCD 类型 2 实现