【问题标题】:SSIS: Conditional Split in C#SSIS:C# 中的条件拆分
【发布时间】:2019-05-10 10:09:01
【问题描述】:

我必须实现的流程根据列值的最后两个字符进行条件拆分。 出于代码维护和性能原因,我需要在 C# 中进行拆分。

如何编码?

我对收集部分没问题,但缓冲区部分对我来说不是很清楚。 我确实有 Input0_ProcessInputRow

output = ComponentMetaData.OutputCollection["CLEANED_DATA_" + Row.ISO2];

但是对于每个 inut 行,我需要对相应的输出缓冲区执行 AddRow...

我该怎么做?

谢谢

【问题讨论】:

  • For code-maintenance and performance reasons!与在脚本组件中实现相同的逻辑相比,条件拆分更高效且更易于维护。
  • 谢谢哈迪。在提供的示例中,缓冲区是 MyAddressOutputBuffer ...其中输出是 MyAddressOutput ...在我的情况下,输出是根据输入值动态选择 ....
  • 我提供了一个更详细的答案,你检查了吗?

标签: c# ssis conditional-split


【解决方案1】:

SSIS 中的组件是用 C# 编写的,因此脚本组件不会比数据流组件带来性能提升。我很想知道通过条件拆分组件与脚本组件实现条件拆分的两个相同包之间的基准性能差异是什么。您可能在其他地方遇到了性能瓶颈。

您提到拆分是动态处理的,您能否更具体地说明一下规则是什么?通常,可以使用派生列转换来处理行拆分,该转换可以创建一个名为 RowSplitIndicator 的新列,该列可以是位、整数、字符串值。从那里,可以根据 RowSplitIndicator 中的任何值有条件地拆分行。这在拆分逻辑复杂的情况下简化了整体设计。

但是,您的问题的答案是,您首先需要向管道缓冲区添加一行,然后您可以将值分配给缓冲区的列:

MyAddressOutputBuffer.AddRow();
MyAddressOutputBuffer.OutputColumnName = YourVariable;

注意:您的脚本组件现在是异步的,即输入一行,输出多行。

【讨论】:

    【解决方案2】:

    你提到过:

    出于代码维护和性能原因。我需要在 C# 中进行拆分

    条件拆分比在脚本组件中实现相同的逻辑更高效且更易于维护,尤其是在您需要实现异步逻辑的情况下。

    无论如何,要使用脚本组件来做到这一点,您可以简单地使用 switch 语句来做到这一点:

    switch (Row.ISO2){
    
        case "Value1":
            Output1Buffer.AddRow();
            Output1Buffer.Column = Row.Column;
            break;
    
    
        case "Value2":
            Output2Buffer.AddRow();
            Output2Buffer.Column = Row.Column;
            break;
    
    
        case "Value3":
            Output3Buffer.AddRow();
            Output3Buffer.Column = Row.Column;
            break;
    
        default:
            Output4Buffer.AddRow();
            Output4Buffer.Column = Row.Column;
            break;
    }
    

    确保所有输出都没有同步输入,并且该属性设置为None

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多