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

时间:2016-11-17 21:22:56

标签: sql-server ssis data-warehouse scd

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

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

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

名字,姓氏,邮政编码 Jane,Doe,14222

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

名字,姓氏,邮政编码 Jane,Doe,Unknown

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

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

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

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

一些MERGE语句或一系列UPDATEINSERT语句可能会为您提供最大的逻辑和性能灵活性。

对于SCD Type 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);