评论空间不足,无法提供反馈。发布一个不完整的答案,因为我需要离开这一天。
你将很难完成你所要求的。根据您在 Gowdhaman008 的回答中的评论,在终结器事件触发(我认为是 OnPostExecute)之前,变量的值在数据流之外是不可见的。您可以通过使用脚本任务来计算行数并触发自定义或预定义事件以报告包进度,从而欺骗并获取该数据。实际上,只是捕获OnPipelineRowsSent
事件。这将记录有多少行正在通过特定的接合点和围绕它的时间。SSIS Performance Framework Plus,您不必对您的东西进行任何自定义工作或维护。开箱即用的功能是绝对的胜利。
也就是说,在完成之前,您不会真正知道有多少行从源中出来。这听起来很愚蠢,我完全同意,但这是事实。想象一个简单的例子,一个 OLE DB 源将 1,000,000 行直接发送到一个 OLE DB 目标。最有可能的是,并非所有 1M 行都会在管道中开始,也许只有 10k 行会在第一个缓冲区中。这些缓冲区被推送到目的地,现在您知道 10k 行中的 10k 行已被处理。起泡,冲洗,重复几次,在这个缓冲区中,一行在不应该出现的地方有一个 NULL。Boom 爆炸了,过程失败了。我们已经有 60k 行流入管道,这就是我们所知道的全部,因为失败了。
确保我们已考虑所有源行的唯一方法是将异步转换放入管道中以阻塞所有下游组件,直到所有数据到达。这将消除您从软件包中获得良好性能的任何机会。您仍然会受到上述更新变量的限制,但您的 FireXEvent 消息将准确地描述队列中可以处理的行数。
如果你启动了一个显式事务,你可以做一些丑陋的事情,比如执行 SQL 任务,只是为了获得预期的计数,将它写入一个变量,然后记录处理的行,但是你会双重查询你的数据,你会增加阻塞的可能性由于双泵,在源系统上。这仅适用于数据库之类的东西。相同的概念适用于平面文件,但现在您需要一个脚本任务来首先读取所有行。
这变得更难看的是一个缓慢启动的数据源,比如一个 Web 服务。默认缓冲区大小可能会导致整个包运行的时间比它需要的简单得多,因为我们正在等待数据到达 慢启动
我会做什么
我会使用 Row Count记录我的开始计数和错误计数(以及更多)。这将帮助您说明所有传入和去向的数据。然后我会打开该OnPipelineRowsSent
事件以允许我查询日志并立即查看有多少行正在流经它。