【问题标题】:How to determine the last row of rowset for further processing during data flow?数据流时如何确定行集的最后一行以便进一步处理?
【发布时间】:2014-08-19 16:14:28
【问题描述】:

我对 SSIS 2014 数据流有疑问。我需要在数据流期间确定行集的最后一行。我需要它在同一数据流中进行进一步处理。 使用脚本组件,我尝试了 NextRow() 和 EndOfRowset() 函数。但是,使用以下代码,这些功能无法可靠运行:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (!Row.NextRow()) // never true.
    {
        MessageBox.Show("last row");
    }

    if (Row.EndOfRowset()) // never true.
    {
        MessageBox.Show("last row");
    }
}

原因是一些缓冲区大小问题,您可以在此处阅读:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/b07c5324-56ff-48dc-991c-3947aecf1558/endofrowset-doesnt-work?forum=sqlintegrationservices

所以我尝试测量行数,以便确定最后一行。不幸的是,行计数转换在处理所有行时将确定的行计数分配给变量。所以我不能在数据流期间使用它。

如何确定数据流期间的最后一行,以便单独处理这一行?

【问题讨论】:

  • 您能否在数据流之前确定它,或者通过在查询输出中包含“isLast”列,或者在 executeSQL 任务中执行 COUNT 查询?
  • 您好 Tab Alleman,由于我没有找到关于如何确定数据流期间的最后一行的解决方案,因此我在之前的数据流中使用行计数转换来完成此操作。这也适合解决我的问题。感谢您的帮助!

标签: sql sql-server ssis script-component


【解决方案1】:

您将希望在 Input0_ProcessInput 方法中执行此操作。尝试在您的脚本组件中测试此代码:

public override void Input0_ProcessInput(Input0Buffer Row)
    {
        base.Input0_ProcessInput(Row);

        //Will be true this time
        if (Row.EndOfRowset())
        {
            MessageBox.Show("Last Row");
        }
    }

【讨论】:

  • 感谢您的回答,并对我迟到的回复感到抱歉。我尝试了您的解决方案,但无法访问 if 子句中最后一行的列值。例如当我将MessageBox.Show("last row: " + Row.idColumn) 放入 if 子句时,我得到错误 PipelineBuffer has遇到无效的行索引值 尽管输入列被激活(并且可以在Input0_ProcessInputRow方法中访问)。我的目标是将Row.idColumn 的值分配给一个全局变量。
  • 这对我有用!起初没有意识到您在谈论 Input0_ProcessInput 函数,而不是 Input0_ProcessInputRow,它是自动添加到 Script 组件中的源代码的,无论出于何种原因,EndOfRowset 在那里不起作用。因此,添加上面的函数,您可以在 While (Row.NextRow()) 循环中调用现有的 ProcessInputRow 函数(如果需要)。然后在 While 循环完成后检查 EndOfRowset。
猜你喜欢
  • 2011-06-25
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多