使用查找组件与脚本组件进行SSIS查找

使用查找组件与脚本组件进行SSIS查找,ssis,lookup,script-component,Ssis,Lookup,Script Component,我需要从EDW表(它维护历史记录)加载维度,并且类型为Key-Value-Parameter 如果在EDW中获得如下记录,则我的场景是正常的 Key1 Key2 Code Value EffectiveDate EndDate CurrentFlag 100 555 01 AAA 2010-01-01 11.00.00 9999-12-31 Y 100 555 02

我需要从EDW表(它维护历史记录)加载维度,并且类型为Key-Value-Parameter

如果在EDW中获得如下记录,则我的场景是正常的

Key1  Key2   Code     Value     EffectiveDate           EndDate        CurrentFlag
100   555     01      AAA       2010-01-01 11.00.00     9999-12-31         Y
100   555     02      BBB       2010-01-01 11.00.00     9999-12-31         Y
这需要通过将其旋转为

键1和键2组合为DM生成自然键

 SK    NK       01     02        EffectiveDate        EndDate      CurrentFlag
 1    100-555   AAA    BBB       2010-01-01 11.00.00  9999-12-31        Y
我的ssis包可以很好地进行数据透视。。。在DIM中查找传入的NK。。如果是新的,将插入。。否则,将使用生效日期进行进一步查找,并确定相同自然密钥的传入属性中是否有任何新的(更改)。。如果是,则通过设置当前记录的结束日期来更新当前记录,并使用新属性值插入新记录,并提取其他属性的最近记录值

我的问题是,如果同一个自然键在一次提取中两次使用同一属性,那么我的第一次查找将在自然键上进行。。将让两条记录通过并尝试插入。。它失败的地方。如果我在NK上得到不同的记录,则第二条记录不会被拾取,需要再次运行包

所以我的问题是,当同一个NK在一次提取中出现两次时,我如何配置查找或一种主动方式来处理这种情况,如果Dim表中不存在,我将能够插入第一条记录,而对于第二条记录,我应该能够根据上面插入的记录进行更新

我不确定我要解释的是否有道理。将在周一将截图附回工作台


感谢

查找不适合这一点-使用缓存和所有东西,它无法查找以前设置的值

您最好将其传递给SQL命令任务,并让存储的进程根据找到的内容执行插入或过期/插入

您还可以将它们流式传输到一个表中并成批执行

要解决您的流及其试图填充的模型,请执行以下操作:

首先,当输入中的行顺序导致行为差异时,总是很尴尬,即NK=A,Val=1,然后NK=A,Val=2给出的行为与NK=A,Val=2,然后NK=A,Val=1不同。人们不得不怀疑这是否是正确的尺寸设计。请记住,所有维度属性都是基于务实的选择分配给维度表的。最终,尺寸可以随意排列到表格中,因此不同的设计可能更有意义。如果在一次装载中情况发生了变化,这可能表明您需要分解该装载以匹配谷物(不尝试一次装载2天的数据)

我注意到在维度中有一个生效日期和一个结束日期。现在这听起来很像维度行为的属性(在NK上01和02代码正在更改),而不是该维度将要附加到的事实的属性。这可能表明它需要在一个单独的无事实事实的事实表中进行跟踪,比如(SK,EffectiveDate,EndDate)-或者这并不重要,因为您所关心的只是一个附加到事实的NK,01,02组合,在这种情况下,您的自然键实际上是NK,01,02的全部

我建议回到您的事实表和传入的提要以及预期的使用情况,并更仔细地查看它,看看是否需要一个单独的无事实事实的事实表来跟踪这些维度的更改


另外,如果你能发布更多的细节,这可能会有所帮助,当我看到更多的商业案例时,我会看看Kimball的材料中有什么内容。

Cade的评论很到位,但我相信你的主要问题是重复,句号。在“源”流中有相同NK的两个版本这一事实是否表明有两个独立的、有意义的版本?还是只有“最后”版本才重要

如果两个版本中反映的更改都应该反映在维度表中,那么我将响应Cade的建议,将处理分为多个批次。您可以按NK(和更改时间)对输入进行排序,然后使用行计数脚本枚举每个NK的“版本”,然后按版本号处理“批”


如果只需要将最后一个“版本”合并到维度表中,我建议您在使用查找之前消除重复项。

谢谢Cade,这很有意义。如果我的方法是连接两个数据源,旋转数据,然后通过脚本组件传递它们,通过将新传入属性=>dump的其他值拉入临时表并与实际dim合并,计算出源记录。使用脚本组件会对性能造成什么影响?这是一个场景。@Nev_Rahd任何逐行执行的操作都会比DB慢。我想你真的需要看看你的模型。我又加了一些材料。模型应与提要相匹配,以使数据的建模方式反映数据在子代码随时间“摆动”方面的行为。我认为这是一个建模问题,而不是ETL问题,因为我不认为当您查询与此维度相关的事实表时,您将使用生效日期和结束日期,因为它们与代码分配相关,而不是与(当前)维度相关事实。@Nev_Rahd因为提要中要分配给这些维度的事实是由SK物理分配给维度的,所以在查询DB时生效日期无关紧要。