SSIS条件分割多个真实路径

问题描述:

我有一个数据流在一个dtsx包内处理所有我需要处理的数据。最后,我需要执行一些清理任务。例如,假设下面的stucture:SSIS条件分割多个真实路径

What I'd like to do

如果三种情况下都那么我想运行所有三个OLE DB命令的记录是真实的。如果记录对于唯一情况1是真的,那么它应该只运行情况1.

我可以用多播和3个独立的条件分割(如下所示),但我希望有一个更清晰的方法。有任何想法吗?

Possible alternative. Is there a better way?

使用多播和三个条件分割是最容易实现的,也可能是最容易理解的。

设置为具有三个输出的转换的脚本组件可能是下一个最容易实现的脚本组件,但它将涉及一堆设置和一定级别的编码。数据流会显得比较漂亮:

enter image description here

对于每个输出,确保设置Synchronous Input IDNone(以便创建行的时候,你可以控制);那么您需要在每个输出中复制每个输入列。脚本代码本身将如下所示:

public override void IncomingRows_ProcessInputRow(IncomingRowsBuffer Row) 
{ 
    if (Case1Logic(Row)) 
    { 
     Case1OutputBuffer.AddRow(); 
     Case1OutputBuffer.ProductId = Row.ProductID; 
     Case1OutputBuffer.Name = Row.Name; 
     // etc. for all columns 
    } 
    if (Case2Logic(Row)) 
    { 
     Case2OutputBuffer.AddRow(); 
     Case2OutputBuffer.ProductId = Row.ProductID; 
     Case2OutputBuffer.Name = Row.Name; 
     // etc. for all columns 
    } 
    if (Case3Logic(Row)) 
    { 
     Case3OutputBuffer.AddRow(); 
     Case3OutputBuffer.ProductId = Row.ProductID; 
     Case3OutputBuffer.Name = Row.Name; 
     // etc. for all columns 
    } 
} 

private bool Case1Logic(IncomingRowsBuffer Row) 
{ 
    // Whatever the Case 1 logic involves 
} 
private bool Case2Logic(IncomingRowsBuffer Row) 
{ 
    // Whatever the Case 2 logic involves 
} 
private bool Case3Logic(IncomingRowsBuffer Row) 
{ 
    // Whatever the Case 3 logic involves 
} 

当人们决定更改列时,务必保持最新状态!

如果这对你来说不够毛,你可以自己编写自定义转换。关于如何做到这一点的血淋淋的细节在MSDN;足以说明将会有更多的代码涉及到lot。您还将学到比您想要的更多的关于SSIS如何处理缓冲区管理的内容,这可能反过来解释为什么开箱即用的条件拆分不允许您将同一行发送到多个输出。

最后,如果你想要一个真正丑陋的解决方案,也将是一个维护噩梦,请尝试构建一个条件拆分,每个案例组合一个输出。在每个OLE目标前放置一个Union All转换。将Cases 1, 2 and 3输出指向三路多点传送,其中一个多点传送输出进入三个Union All转换中的每一个。条件分割的Cases 1 and 2,Cases 2 and 3Cases 1 and 3输出将分别进行双向多播转换(这将反过来馈送适当的Union All),而Case 1,Case 2Case 3输出将直接转到适当的Union All。这将是这个样子:

enter image description here

综上所述,我觉得你最初的想法是最简单,可能是最好的。

+1

哇。感谢所有的努力和细节。我想我会坚持我的原创。 – Greg 2013-03-08 04:49:07

+0

我认为这是最好的选择,除非你真的想进入基本的编程。 (有时候,我们中的一些人真的很喜欢这样做......)很高兴有帮助! – 2013-03-08 16:10:27

取决于你是多么舒适的C#或VB,你可以写你自己的变换,它本质上是一个多播和条件拆分。将一个脚本组件添加到数据流中,它会询问您是源,转换还是目的地。选择变换,添加输入和三个输出,然后从那里开始。祝你好运!

+0

我想这会工作。似乎只是为了保持整洁而付出一点努力。我希望有东西在... – Greg 2013-03-08 03:47:10