【问题标题】:Finding the last row in SSIS Script Component查找 SSIS 脚本组件中的最后一行
【发布时间】:2011-03-08 05:00:44
【问题描述】:

我有一个 SSIS 2008 脚本组件,它使用方法

Input0_ProcessInputRow(Input0Buffer 行)

处理行。有没有办法找出我正在阅读的行是否是数据集中的最后一行。

【问题讨论】:

  • 找到最后一行后要做什么?
  • 基于最后一行我需要编写一些自定义逻辑。
  • 逻辑会影响最后一行、整个数据集,还是填充变量或类似内容?

标签: ssis


【解决方案1】:
if (Row.EndOfRowset()) { // this is the last row }

【讨论】:

  • 我刚刚在 Visual Studio 的 BI 工具上测试了这种模式,但它对我不起作用。
【解决方案2】:

覆盖 InputRows_ProcessInput 的解决方案对我有用。但是,不要乱用代码。方法的名称取决于输入的名称。就我而言,方法签名是:

public override void Input0_ProcessInput(Input0Buffer Buffer)

找出正确方法的简单方法是进入脚本并键入“base.Input”,智能感知应该会为您提供正确的覆盖方法。

public override void **Input0_ProcessInput**(**Input0Buffer** Buffer)
    {
        while (Buffer.NextRow())
        {
            Input0_ProcessInputRow(Buffer);
        }

        if (Buffer.EndOfRowset()) 
        {
            //do something 
        }
    }

仅检查“Buffer.EndOfRowset()”是不够的,它在“while (Buffer.NextRow())”循环内不起作用。所以我猜“EndOfRowset”出现在最后一行之后。

【讨论】:

  • “需要考虑的事情。在我的情况下,仅检查“Buffer.EndOfRowset()”是不够的。”也许我在这里误解了一些东西。据我所知,您检查EndOfRowset 的部分是您的答案中唯一真正旨在回答问题的部分。你是说你给出的答案不起作用?
  • 我给出的答案有效。什么不起作用是使用 EndOfRowset withinwithout while 循环。
  • 啊,我明白了。感谢您的澄清。
【解决方案3】:

我之前没有尝试过,但是在您的脚本组件之前,添加一个 RowCount 任务并在此任务中设置一个变量的值(称为 RowCnt,此处初始化为 0)。然后在你的脚本中,有这样的东西(确保变量声明在类中)......

Public Class ScriptMain
Inherits UserComponent

Dim iRows As Integer

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    iRows = iRows + 1
    If iRows = Variables.RowCnt Then
        'Do something here
    End If
End Sub

End Class

这应该允许您处理最后一行。

【讨论】:

    【解决方案4】:

    如下重写 InputRows_ProcessInput 方法:

    public override void InputRows_ProcessInput(InputRowsBuffer Buffer)
        {
    
            while (Buffer.NextRow())
            {
                InputRows_ProcessInputRow(Buffer);
            }
    
            if (Buffer.EndOfRowset()) 
            {
                //do something 
            }
    
        }
    

    【讨论】:

    • EndOfRowset 似乎无法正常工作-我正在使用异步转换。它从未被发现是真的
    【解决方案5】:

    自定义脚本代码写在 ScriptMain 类中。此类继承自包含虚方法 FinishOutputs() 的 UserComponent。您可以在 ScriptMain 中覆盖它以在最后一行之后执行您需要运行的代码。

    UserComponent 中的相关代码。

    public override void ProcessInput(int InputID, string InputName, PipelineBuffer Buffer, OutputNameMap OutputMap)
    {
    
        if (InputName.Equals(@"Input 0", StringComparison.Ordinal))
        {
            Input0_ProcessInput(new Input0Buffer(Buffer, GetColumnIndexes(InputID), OutputMap));
        }
    
        if (Buffer.EndOfRowset)
        {
            InputsFinished = InputsFinished + 1;
            if (InputsFinished == 1)
            {
                FinishOutputs();
                MarkOutputsFinished();
            }
        }
    
    }
    
    public virtual void FinishOutputs()
    {
    }
    

    请注意,此代码是自动生成的,无法更改。然而,它确实有效地为您提供了放置代码的位置,因为您可以在 ScriptMain 中的代码中覆盖 FinishOutputs(),如下所示:

    public override void FinishOutputs()
    {
       //do stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多