nle*_*r18 5 sql-server events ssis rows event-handling
我正在开发一个项目来为我们的SSIS包添加日志记录.我通过实现一些事件处理程序来进行自己的自定义日志记录.我已经实现了OnInformation事件,将时间,源名称和消息写入日志文件.当数据从一个表移动到另一个表时,OnInformation事件将给我一条消息,例如:
组件"TABLENAME"(1)"写了87行.
如果其中一行失败,并且假设只有85行被处理出预期的87.我会假设上面的行会读取wrote 85 rows.在这种情况下,如何跟踪应该处理的行数?我想看到类似的东西wrote 85 of 87 rows.基本上,我想我需要知道如何从Source的查询中获取返回的行数.是否有捷径可寻?
谢谢
您可以使用Row Count transaformation数据源之后并将其保存为变量.这将是要处理的行数.一旦加载到Destination中,您应该使用Execute SQL Taskin Control flow并使用Select Count(*) from <<DestinationTable>>并将计数保存到Other变量[您应该在查询中使用Where子句来标识当前负载].因此,您将处理数字行以进行日志记录.
希望这可以帮助!
评论中没有足够的空间来提供反馈。由于我需要离开一天,所以发布了不完整的答案。
你将很难完成你所要求的事情。根据您在 Gowdhaman008 的答案中的评论,变量的值在终结器事件触发之前在数据流之外不可见(我认为是 OnPostExecute)。您可以通过使用脚本任务来计算行数并触发事件(自定义或预定义)来报告包进度,从而欺骗并获取数据。事实上,只需捕捉OnPipelineRowsSent事件即可。这将记录有多少行正在通过特定的接合点及其周围的时间。SSIS Performance Framework Plus,您无需对您的东西进行任何自定义工作或维护。开箱即用的功能无疑是一个胜利。
也就是说,在完成之前您不会真正知道源中有多少行。这听起来很愚蠢,我完全同意,但这是事实。想象一个简单的情况,一个 OLE DB 源将直接将 1,000,000 行发送到 OLE DB 目标。最有可能的是,并非所有 1M 行都会在管道中启动,可能只有 10k 行会位于第一个缓冲区中。这些缓冲区被推送到目的地,现在您知道 10k 行中的 10k 行已被处理。起泡、冲洗、重复几次,在该缓冲区中,一行在不应该出现的地方出现了 NULL。爆炸引爆了炸药,整个过程失败了。我们已经有 60k 行流入管道,这就是我们由于失败而知道的全部内容。
确保我们已考虑所有源行的唯一方法是将异步转换放入管道中以阻止所有下游组件,直到所有数据到达为止。这将消除您从软件包中获得良好性能的任何机会。您仍然会受到上述关于更新变量的限制,但您的 FireXEvent 消息将准确描述队列中可以处理的行数。
如果你启动了一个显式事务,你可以做一些丑陋的事情,比如执行 SQL 任务,只是为了获得预期的计数,将其写入变量,然后记录处理的行,但随后你会双重查询你的数据,并增加阻塞的可能性由于双泵,在源系统上。这仅适用于数据库之类的东西。同样的概念也适用于平面文件,只不过现在您需要一个脚本任务来首先读取所有行。
对于启动缓慢的数据源(例如 Web 服务)来说,情况会变得更糟糕。默认缓冲区大小可能会导致整个包的运行时间比简单所需的时间长得多,因为我们正在等待数据到达 缓慢启动
我将使用行计数记录我的起始计数和错误计数(以及更多)。这将帮助您了解所有传入的数据及其去向。然后,我将打开该OnPipelineRowsSent事件以允许我查询日志并查看现在有多少行正在流过它。

| 归档时间: |
|
| 查看次数: |
65110 次 |
| 最近记录: |