如何使无效行上的SSIS组件失败

时间:2011-08-16 09:18:44

标签: visual-studio-2008 ssis bids

我希望能够做到以下几点:

  • 逐行导入平面文件
  • 对每行的列值进行条件拆分
  • 如果我检测到有效值,我想继续这一行
  • 如果在任何情况下我检测到一个不可能的值我想要失败该组件,以便工作流程停止并且我收到错误

示例:我有一个包含三列的文件(“type”,“value”,“message”)

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

除了“失败”部分,我有其他所有东西。我将最后一个条件(“列不是1,2或3”)的输出配置为“Fail Component”,但它实际上并没有使组件失败。

2 个答案:

答案 0 :(得分:7)

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

在脚本组件内添加

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

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

答案 1 :(得分:0)

我只想添加一些我搜索过的东西,最后单独找到...

就像Daryl所说,如果你只使用ComponentMetaData.FireError()方法,你会看到执行结果中的错误,但脚本组件不会失败。数据流任务将失败但仅在最后,在完成工作后(因此可能在一些INSERT和/或UPDATE之后)。 如果要完全停止数据流执行,可以这样做:

  • 使用2个输出在失败情况下创建条件拆分
    1. 行确定
    2. 不符合条件的行
  • 在第二个输出上,运行触发错误的脚本,每行都有一条清除消息。 脚本组件必须是转换,而不是目标,才能获得输出。
  • 在脚本组件之后,添加一个 OLE DB命令,它会在目标库上引发SQL错误: RAISERROR(N'At least one line not configured have been found',16,1)
  • 最后,在OLE DB命令使用 Union All 组件将条件分割的第一个输出(行OK)与OLE DB命令的输出连接后。

这样,您就可以为不符合条件的每一行引发错误,并在插入记录之前停止数据流任务,如果发生至少一个错误。