加入和'集体'在事实之后有条件地操纵去标准化的一对多分裂

时间:2013-08-22 07:40:06

标签: c# sql ssis

标题上的棘手问题并准确解释 - 如果有任何不清楚的地方,请告诉我。

我有一个非规范化的数据流,请考虑:

Input one:

ID
Value
FKID

Input two:
FKID
DiffValue
CheckValue

输入一行可以有多个输入两行,显然与FKID有关。

现在,在加入之后我可能会有:

[ID] - [Value] - [DiffValue] - [CheckValue]
1 - A - D1 - C1
1 - A - D2 - C1
1 - A - D3 - C2

然后,我根据CheckValue进行条件拆分 - 搜索值:C2。如果是C2,请将Value更改为DiffValue。离开我:

拆分一个:

1 - A - D1 - C1
1 - A - D2 - C1

分裂两个:

1 - D3 - D3 - C2

现在我想确保我的所有行都有D3值。这里的事情是,拆分永远不可能成为现实,在这种情况下我需要它继续保持原始A值,但如果只有一行满足检查值条件,所有行都需要DiffValue。

脚本转换组件不起作用,因为它基于缓冲区,我无法缓存所有行,一次在整个行集合上执行代码,然后再将它们发送到输出。我甚至无法对临时SQL执行简单的存储ID并在之后基于ID执行查找,因为在条件拆分之后它是两个并行的异步路径,所以我不能暂停第一次拆分,直到临时SQL表之后填充。

我可以执行脚本目标,然后缓存所有行,在每行缓存后执行我的操作,然后使用相关列创建自定义输出,但是,还有更多列(这是一个简化的示例),并且必须处理该自定义输出的维护是压倒性的。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我通过在拆分之前添加一个额外的列来解决这个问题,称为HasNeededValue(为了简单起见而解释)。然后我删除了拆分,替换为单个脚本转换。

在进程行中,我检查了我需要的值(在示例中它是CheckValue = C2),如果它满足我的条件,我将HasNeededValue设置为1.然后我在脚本之后添加了一个排序HasNeededValue(desc)将所有内容汇集到一个新的脚本转换中,其中包含[ID]的列表。

在进程行上,我检查HasNeededValue是否为1,如果是,则将DiffValue复制到Value,然后将ID插入列表。如果它不是= 1,那么我检查列表是否包含ID,并将DiffValue复制到Value。

这确保了可能具有在所有行上设置值所需的值的一行始终是第一行,并且我知道它是哪个ID,对于没有必要条件的行。