【问题标题】:SSIS event handlerSSIS 事件处理程序
【发布时间】:2019-05-07 11:23:52
【问题描述】:

我需要一些帮助, 我正在尝试获取有关 SSIS 错误的信息 我使用事件处理程序。我尝试使用系统变量错误描述来捕获错误 然后我在表上插入错误,但是这个系统变量包含任务错误,我想在表上插入错误行而不是任务执行错误,因为它更具可读性

当我转到执行结果时,我有两行错误:

一个错误:XXX

和其他 [执行任务] 错误:XXX

信息:

  • 我无法使用包顶部树上的处理程序,因为我还有其他错误要管理。
  • 我在同一个包的其他容器上使用相同的机制
  • 我从控制流而不是数据流中发现了错误

我正在使用事件处理程序,并且在事件上我有一个任务更新表集注释 =?哪里 id = ?

非常感谢你

【问题讨论】:

  • 从表面上看,错误是说您正在插入重复的密钥。
  • thx 我知道这是我想在表日志中插入此错误而不是下面的错误的错误,系统变量包含第二行而不是第一行。
  • 您能否澄清哪些错误消息正在写入您的数据库,听起来您已经同时捕获了它们?是否只想捕获第一个?
  • 我想捕捉第一个,或两者兼而有之,但使用这种方法我只捕捉第二个
  • 您能分享一下您的错误处理程序的 SQL 语句吗?我还会尝试使用仅显示MessageBox.Show(Dts.Variables["System::ErrorDescription"].Value.ToString());Script Task 错误处理程序来调试它,看看是否会发现错误。

标签: sql-server ssis ssis-2012


【解决方案1】:

是您的事件处理程序 SQL 导致了问题:

update table set comment = ? where id = ?

您正在用第二个错误消息覆盖第一个错误消息。

要同时捕获它们,请改用INSERT

编辑

如果您只想插入第一条错误消息,您可以在您的 SSIS 包中添加一个 Boolean 变量,例如,称为“ErrorSet”,它在包的开头设置为 false。然后,您可以将其传递给错误处理程序并执行类似的操作(第一个 ? 是 'ErrorSet'):

IF ? = 0
    update table set comment = ? where id = ?
;

SELECT CAST(1 AS bit) ErrorSet

然后,您可以将“ErrorSet”结果写回到 SSIS 包变量中,这将防止发生任何进一步的更新。

您还可以通过使用不同的变量或将相同的变量重置回false,将其范围限定为包的不同区域。

【讨论】:

  • 也许你是对的,但我已经有一个带有 id 的列我只想更新带有错误消息的列我可以说只更新一次或其他吗?
  • thx 我已经添加了脚本任务,我有第一条消息,然后是第二条消息,所以我更新了最后一个错误,有什么解决方案让我可以插入它们两个或只插入第一个
  • 我添加了一个表达式任务,强制将值直接放到表格中
  • 我用一个可能有用的想法更新了我的答案。
【解决方案2】:

来自@ChrisMack 的回答:

是您的事件处理程序 SQL 导致了问题:

update table set comment = ? where id = ?

您正在用第二个错误消息覆盖第一个错误消息。

我添加了一个表达式任务来强制将值直接放入表格中。

【讨论】:

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