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