1

我有几个包需要按特定顺序运行。为此,我有一个额外的包来运行所有其余部分。
我在对包的每次调用中添加了事件处理程序,以便使用 OnError、OnPreExecute 和 OnPostExecute 向用户显示进程的状态(执行、成功、失败)。

我没有意识到的是,在包的每个部分每次成功时,它都会返回一个 OnPostExecute,然后在启动同一包的下一部分时返回一个新的 OnPreExecute。
这会导致用户感到困惑,因为他认为一个阶段已经完成,但随后看到它仍在执行。

如何让事件处理程序仅引用包级事件?
任何其他建议也将不胜感激。

谢谢!

4

2 回答 2

3

我想出的解决方案是使用事件处理程序中可用的系统变量之一。在每个 OnPreExecute、OnPostExecute 和 OnError 作用域中,您至少可以找到一个@[System::SourceName]变量。

@[System::SourceName]包含引发事件的任务的名称。

使用它,您可以检查顶级包本身、执行包任务之一或包中的任何其他任务是否引发了事件。
这样,即使我们无法停止多次调用,我们也可以控制响应。

例如,您很可能会使用基于@[System::SourceName] 的优先约束来检查它是否是整个包名。

这不是最优雅的解决方案(它需要您拥有一致的 EP 任务名称,或者在事件处理程序中对它们进行硬编码),但它确实有效。

可悲的是,我找不到一种方法来防止子包中的事件在主包中引发。

于 2013-10-22T11:31:56.330 回答
1

一个简单的解决方案是在数据库中创建一个 SSIS 事件日志表,并在每个事件处理程序参数上指定用户变量,这些参数在列表中可用。然后为创建连接执行执行 SQL 任务并将以下查询添加到

INSERT INTO dbo.SSIS_events (EIGUID, PackageName, SourceName, EventInfo) VALUES (?,?,?,'OnPreExecute')

跟踪特定任务。

于 2018-12-31T12:18:39.937 回答