关于visual studio 2008:如何在无效行上使SSIS组件失败

How to fail SSIS component on invalid rows

我希望能够执行以下操作:

  • 逐行导入平面文件
  • 对每行的列值执行条件拆分
  • 如果检测到有效值,我希望继续此行
  • 如果在任何情况下,我检测到一个不可能的值,我希望使组件失败,这样工作流停止,我得到一个错误

示例:我有一个包含三列的文件("类型"、"值"、"消息")。

我想使用平面文件目标逐行导入该文件。然后我想做条件分割。如果"type"列的值为"1",我想将该行写入destinatoin。如果类型是"2"或"3",我想忽略它们。但是,如果它是"A"或"0",我想使组件失效。

除了"失败"部分,我什么都有。我将最后一个条件("列不是1、2或3")的输出配置为"失败组件",但它实际上不会使组件失败。


将脚本组件添加到数据流(作为目标),并将其链接到条件拆分,以满足您要强制包失败的条件。

在脚本组件中添加

1
2
    bool pbCancel = false;
    this.ComponentMetaData.FireError(100,"Script Component","Data Error <type message here>","", 0, out pbCancel);

脚本组件本身将成功,但数据流任务将失败,并应导致包失败。


我只想添加一些我搜索了一会儿,最后发现的东西…

如Daryl所说,如果您只使用ComponentMetaData.FireError()方法,您将看到执行结果中的错误,但脚本组件不会失败。数据流任务将失败,但只会在完成该任务后(因此可能在某些插入和/或更新之后)结束。如果要完全停止数据流执行,可以这样做:

  • 根据失败条件创建一个条件拆分,并有两个输出:
  • 行行
  • 不符合条件的线条
  • 在第二个输出上,运行触发错误的脚本,并为每行显示一条清晰的消息。脚本组件必须是转换,而不是目标,才能有输出。
  • 在脚本组件之后,添加一个在目标库上引发SQL错误的OLE DB命令:RAISERROR(N'At least one line not configured have been found',16,1)
  • 最后,在ole db命令之后,使用union all组件将条件拆分(行OK)的第一个输出与oledb命令的输出连接起来。

这样,您就能够为不满足条件的每一行引发一个错误,并在插入记录之前停止数据流任务(如果至少发生一个错误)。