SSIS:从outputbuffer中删除空行

时间:2011-04-29 14:40:54

标签: sql-server-2008 ssis script-component

我在数据流任务上有错误。

我有一个ado.net源代码转到异步脚本组件。

问题出现在从脚本组件插入到目标所在的最后端

尝试将空行自动放入我表中的输出缓冲区。

有没有办法防止这种情况发生/如何操作输出缓冲区以便我可以从中删除特定的行?

3 个答案:

答案 0 :(得分:1)

您说源是转到异步脚本组件。如果这是真的,那么你已经在控制行何时进入输出缓冲区。

默认情况下,脚本组件是同步的。每个输入行都有一个输出行。也许这就是你目前的设置。

如果要将脚本组件用作异步组件,则必须执行以下操作:

  • 添加新的脚本组件
  • 右键单击该组件,然后选择“显示高级编辑器...”
  • 在“输入和输出属性”上,选择“输出”项并将“SynchronousInputID”值更改为“无
  • 在“输出”选项卡上,添加将定义输出缓冲区的列。您必须定义列,因为与同步脚本不同,输出缓冲区不会自动定义为与输入缓冲区的匹配。

编辑脚本时,可以使用OutputBuffer.AddRow方法在输出缓冲区中创建新行。每次调用AddRow时,现有的缓冲区内容都会从脚本组件发出,并清除下一行。使用规则跳过行,您将在添加或跳过行之前验证输入缓冲区。

答案 1 :(得分:1)

为了解决这个问题,我添加了条件分割组件,并在其中一个空白列上添加了长度检查(即len([testfield])> 0)。然后我将带有该检查的字段发送到数据库,并且没有为其他分支做任何事情。

答案 2 :(得分:0)

问题似乎是SSIS在PreExecute期间执行AddRow()函数。这会在您的public override void ProcessInputRow()函数中与AddRow()的任何使用发生冲突。例如PreExecute创建一个新行来启动,然后手动创建一个新行作为处理的一部分,你现在有2个新行,第一行充满了NULLS并已经传递给outputbuffer。要解决此问题,我会覆盖CreateNewOutputRows()并将其留空,而不是仅根据需要添加行,例如如果正确的数据没有显示在输入缓冲区上,我的一些异步脚本根本不会向输出缓冲区添加一行。

public class ScriptMain : UserComponent {

    public override void CreateNewOutputRows() {}

    public override void Input_ProcessInputRow(InputBuffer Row) {
       if(asNeeded) {
          OutputBuffer.AddRow();
       }
    }
}