Sql server SSIS::如何在不使用SCD向导的情况下在SSIS中实现SCD类型2。当传入数据集具有同一业务密钥的多条记录时

Sql server SSIS::如何在不使用SCD向导的情况下在SSIS中实现SCD类型2。当传入数据集具有同一业务密钥的多条记录时,sql-server,ssis,msbi,scd,type-2-dimension,Sql Server,Ssis,Msbi,Scd,Type 2 Dimension,在SSIS中,如果传入数据集具有同一业务密钥的多条记录,则如何在不使用SCD向导的情况下将其加载到SCD类型为2的维度表中 样本数据集 Customer ID Name Segment Postal Code 1 James Corporate 50026 2 Andrew Consumer 33311 3 Steven Consumer 90025 2

在SSIS中,如果传入数据集具有同一业务密钥的多条记录,则如何在不使用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
在我的例子中,如果我尝试将维度表与其他SSI组件(查找/条件拆分)一起加载,则所有记录都会在表中显示一个新行,因为它们都同时进入

我将“CurrentFlag”作为当前记录的指示器

在SSIS中,如果我有一个传入数据集,该数据集具有相同业务密钥的多个记录,那么我如何识别这些记录,并根据需要设置CurrentFlag,无论目标表中的记录是否已经具有该业务密钥


谢谢。

好的,这是一个巨大的简化,因为SCD的正确实现非常具有挑战性。你需要坐下来批判性地思考这个问题。我下面的回答只处理日常处理-它没有解释如何处理正在重新处理的历史文件,这可能会导致重复记录,并具有不同的有效开始和结束日期

根据定义,您将拥有一个现有的记录源组件(即来自数据库表的查询)和一个传入的数据源组件(即*.csv平面文件)。您将需要执行合并联接以识别新记录与现有记录。对于现有记录,您需要确定是否有任何列已更改(在派生列转换中执行此操作)

您还需要为EffectiveStartDate和EffectiveEndDate包含两列

IncomingEffectiveStartDate = FileDate
IncomingEffectiveEndDate = 12-31-9999
ExistingEffectiveEndDate = FileDate - 1
1999年12月31日注意:这实际上是Y10K错误。但是,它允许用户在日期范围之间查询数据库,而不必在查询的WHERE子句中有意识地添加ISNULL(GETDATE()),以防在日期范围之间查询

这将防止列上的日期重叠,这可能导致针对给定日期返回多条记录

要确定记录是否已更改,请创建一个名为RecordChangedId的新列,其类型为Bit

(ISNULL(ExistingColumn1, 0) != ISNULL(IncomingColumn1, 0) ||
 ISNULL(ExistingColumn2, 0) != ISNULL(IncomingColumn2, 0) ||

....

ISNULL(ExistingColumn_N, 0) != ISNULL(IncomingColumn_N, 0) ? 1 : 0)
然后,在拆分条件下,您可以创建两个输出:
RecordHasChanged
(这将是一个插入)和
RecordHasNotChanged
(这将是一个更新,用于停用现有记录和插入)


可以想象,您可以将两个输入路由到相同的插入目的地。但是,您需要小心地禁止更新记录的现有有效EndDate值,该值将停用该日期

您是否使用
ID
列作为行更改的时间线?因此,当
ID
值变大时,该行是最近的?您能否向我们展示您当前的尝试,特别是使用
查找
?如果您没有按照示例使用多个阶段,那么这就是您要去的地方wrong@iamdaveId是维度表中的标识列和主键。维度表如下所示:创建表CustomerDetails(ID int IDENTITY(1,1)主键、客户ID varchar(50)、名称varchar(50)、段varchar(50)、PostalCode int、标志位);此外,传入数据集没有ID列。。我将编辑该问题。@iamdave我使用的内容与您共享的链接中的内容相同。问题是,由于传入数据集中有多个具有相同客户ID(业务密钥)的行,因此我在不匹配输出中接收到所有行,因此所有行都作为新记录插入维度表中。您如何知道哪一行是最近的?只有知道行是何时创建或更新的,才能缓慢更改尺寸。