我有几个包需要按特定顺序运行。为此,我有一个额外的包可以运行所有其他软件包。
我在每次调用包时都添加了事件处理程序,以便使用 OnError、OnPreExecute 和 OnPostExecute 向用户显示进程的状态(正在执行、成功、失败)。
我没有意识到的是,在包的每个部分每次成功时,它都会返回一个 OnPostExecute,然后在启动同一包的下一部分时返回一个新的 OnPreExecute。
这会导致用户感到困惑,因为他认为一个阶段已经完成,但随后看到它仍在执行。
如何让事件处理程序仅引用包级别事件?
任何其他建议也将不胜感激。
谢谢!
我想出的解决方案是使用事件处理程序中可用的系统变量之一。在每个 OnPreExecute、OnPostExecute 和 OnError 作用域中,您至少可以找到一个 @[System::SourceName] 变量。
@[系统::源名称] 包含引发事件的任务的名称。
使用它,您可以检查事件是否由顶级包本身、执行包任务之一或包中的任何其他任务引发。
这样,即使我们无法停止多个调用,我们也可以控制响应。
例如,您很可能会使用基于 @[System::SourceName] 的优先约束来检查它是否是整个包名称。
这不是最优雅的解决方案(它要求您具有一致的 EP 任务名称,或者在事件处理程序中对它们进行硬编码),但它有效。
可悲的是,我找不到一种方法来防止子包中的事件在主包中引发。
一个简单的解决方案是将 SSIS 事件日志表创建到数据库中,并在每个事件处理程序参数上指定用户变量,这些变量在列表中可用。然后执行一个执行 SQL 任务,用于创建连接,并将以下查询添加到
INSERT INTO dbo.SSIS_events (EIGUID, PackageName, SourceName, EventInfo)
VALUES (?,?,?,'OnPreExecute')
跟踪特定任务。