具有多个传入记录的SSIS SCD向导

时间:2017-12-29 02:02:26

标签: sql-server ssis

PlEASE FORGIVE。我非常拼命地想要如何雄辩地问这个问题。在这里做得不好。

在SSIS中,如果您有一个传入数据集,该数据集具有相同PK的多个记录(如日常处理方法中的日内记录),如何告诉SCD向导预期?

在我的情况下,即使我的所有字段都设置为"历史",它们都显示为新的,因为它们全部同时进入。

Example data:
BK, insertion depth, drill depth, bore depth
1, 1000, 1020, 1022
1, 1025, 1222, 1233
1, 1100, 1321, 1333
2, 1233, 1255, 1022
2, 2222, 3333, 3333
3, 1010, 900, 885

我在一份报告中得到了这个。它们都显示为基本负载的新功能。我有一个create_dt和end_dt作为我的开始和停止时间戳。 create_dt具有变量的system :: startdate。如何让SSIS中的SCD阶段识别这些,并根据需要添加时间戳,无论目标表中的记录是否已具有该PK?

感谢。

更新#1:PK意味着BK。 PK是自动编号。

2 个答案:

答案 0 :(得分:0)

我目前无法添加评论......

我认为你在这里有一些误解。

  1. 如果PK是指主键,则主键定义每行的唯一性。根据定义,你不能有重复的密钥(没有作弊!),或者除非这是来自另一个表的外键?您是如何在SCD向导中声明业务密钥的?

  2. 您说您已将所有字段设置为"历史"?但是当SCD在" PK"上找到匹配时,你不想要新的行?历史属性将保留所有先前记录的历史记录,因此您的记录将在SCD向导中添加为新记录。如果您不想要新记录,并且希望更新现有记录,则需要使用更改属性。

答案 1 :(得分:0)

这在SQL中比在SSIS中更容易处理。 SCD组件将在数据流启动之前将现有行加载到内存中。在评估行时,此记录集不会更新,因此如果您看到同一个businesskey的两条记录,它们将以相同的方式处理。

一种表现更好,更容易理解和维护的方法如下:

  1. 将源中的所有行插入临时表
  2. 在将更新维度表的包中调用proc
  3. 在过程中:
    1. 插入新的SCD行。查询应该比较目标和登台表,以确定在
    2. 之前没有看到哪些行
    3. 插入历史SCD行。此查询应再次比较表以获取正确的记录。您可以使用窗口函数来计算开始日期和结束日期。