6

我正在开发一个项目,以将日志记录添加到我们的 SSIS 包中。我通过实现一些事件处理程序来做我自己的自定义日志记录。我已经实现了 OnInformation 事件以将时间、源名称和消息写入日志文件。当数据从一个表移动到另一个表时,OnInformation 事件会给我一条消息,例如:

组件 "TABLENAME" (1)" 写了 87 行。

如果其中一行失败,假设只处理了预期的 87 行中的 85 行。我假设上面的行将读取wrote 85 rows. 在这种情况下,我如何跟踪应该处理多少行?我想看到类似的东西wrote 85 of 87 rows。基本上,我想我需要知道如何获取源查询返回的行数。是否有捷径可寻?

谢谢

4

5 回答 5

8

您可以Row Count transaformation在数据源之后使用并将其保存为变量。这将是要处理的行数。一旦它被加载到目标中,您应该使用Execute SQL TaskinControl flow并使用Select Count(*) from <<DestinationTable>>并将计数保存到其他变量中[您应该在查询中使用 Where 子句来识别当前负载]。因此,您将处理数字行以进行记录。

希望这可以帮助!

于 2013-01-30T08:17:54.433 回答
5

评论空间不足,无法提供反馈。发布一个不完整的答案,因为我需要离开这一天。

你将很难完成你所要求的。根据您在 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事件以允许我查询日志并立即查看有多少行正在流经它。

在此处输入图像描述

于 2013-01-30T23:02:24.527 回答
2

您想要的是Row Count 转换。只需在源查询之后将其添加到您的数据流中,并将其输出分配给一个变量。然后您可以将该变量写入您的日志文件。

于 2013-01-29T22:21:43.913 回答
0

这是我目前所做的。这是超级乏味的,但它的工作原理。

1)SSIS方法

2)我在所有记录上都有一个恒定的“1”值。它们实际上都是一样的。

3) 使用多播步骤,我将数据流从两个方向发送出去。尽管所有内容都相同,但我们仍然必须按该常数值进行排序。

4)使用聚合步骤聚合该常量,然后将其用于与底部数据流连接(它包含所有实际数据记录,没有聚合)。

这样做可以让我获得初始行数。

  1. 稍后,如下所示,使用条件拆分步骤并在应用您的条件后再次执行相同的操作。如果行数相同,则一切正常,没有问题。

如果行数不同,则说明有问题。

检查成功

这是无需使用其他数据流步骤即可解决问题的方法的总体思路。

TLDR:

通过使用多播、按某个常量值排序和聚合步骤获取其中 1 个条件的行数。

进行排序并合并以获取行数。

使用条件拆分并再次执行。

如果前后行数相同,请执行此操作。

如果前后行计数不同,请执行此操作。

于 2019-02-06T15:39:24.553 回答
-2

如果您有一列没有错误数据,这可能会有所帮助。将第二个平面文件源添加到包中。使用与现有文件源相同的连接。仅选择第一列并将输出定向到行数。

于 2016-05-18T11:14:37.877 回答