我在dtsx包中有一个数据流,它处理我需要处理的所有数据.最后,我需要执行一些清理任务.例如,假设以下结构:

如果所有3个案例的记录都为真,那么我想运行所有三个OLE DB命令.如果记录仅对案例1为真,那么它应该只运行案例1.
我可以使用多播和3个单独的条件分割(如下所示),但我希望有一个更清洁的方式.有任何想法吗?

使用多播和三个条件分割是最容易实现的,也可能是最容易理解的.
脚本组件设置为具有三个输出的转换可能是下一个最容易实现的 - 但它将涉及一堆设置和某种程度的编码.数据流看起来相当漂亮:

对于每个输出,请确保设置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
}
Run Code Online (Sandbox Code Playgroud)
当人们决定要更改列时,请保持最新状态!
如果这对您来说不够毛茸茸,您可以编写自己的自定义转换.关于如何做到的详细信息在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),同时Case 1,Case 2和Case 3产出将直接转到相应的UNION ALL.它看起来像这样:

总之,我认为你最初的想法是最简单的,可能是最好的.
| 归档时间: |
|
| 查看次数: |
5105 次 |
| 最近记录: |