我在dtsx包中有一个数据流,用于处理我需要处理的所有数据。最后,我需要执行一些清理任务。例如,假设以下结构:
如果所有3个案例的记录都为真,那么我想运行所有三个OLE DB命令。如果记录仅对案例1为真,那么它应该只运行案例1.
我可以通过多播和3个单独的条件分割(如下所示)来做到这一点,但我希望有一种更清洁的方式。有什么想法吗?
答案 0 :(得分:7)
使用多播和三个条件分割是最容易实现的,也可能是最容易理解的。
脚本组件设置为具有三个输出的转换可能是下一个最容易实现的 - 但它将涉及一堆设置和某种程度的编码。数据流看起来相当漂亮:
对于每个输出,请务必将Synchronous Input ID
设置为None
(以便您可以控制何时创建行);那么你需要复制每个输出中的每个输入列。脚本代码本身如下所示:
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;足以说明会有更多很多更多的代码。您还可以了解更多关于SSIS如何处理缓冲区管理的知识,这可能反过来解释为什么开箱即用的条件分割不允许您将相同的行发送到更多比一个输出。
最后,如果你想要一个真正丑陋的解决方案,这也将是一个维护噩梦,尝试为每个案例组合构建一个条件性拆分,其中一个输出。将Union All转换放在每个OLE目标的前面。将Cases 1, 2 and 3
输出定向到三向多播,其中一个多播输出将转到三个Union All转换中的每一个。条件拆分的Cases 1 and 2
,Cases 2 and 3
和Cases 1 and 3
输出将分别进行双向多播转换(反过来将提供相应的Union All),而{{1} },Case 1
和Case 2
输出将直接转到相应的Union All。它看起来像这样:
总结,我认为您最初的想法是最简单的,可能是最好的。
答案 1 :(得分:1)
根据您对C#或VB的使用程度,您可以编写自己的转换,实际上是多播和条件拆分。将脚本组件添加到数据流中,它会询问您是源,转换还是目标。选择转换,添加输入和三个输出,然后从那里开始。祝你好运!