我工作的一个项目,以记录添加到我们的SSIS包。我通过实施一些事件处理程序的做我自己的自定义日志记录。我已经实现了OnInformation事件来写的时候,源名称和消息日志文件。当数据从一个表移动到另一个时,OnInformation事件会给我一个消息,如:
组分 “TABLENAME”(1)”中写道87行。
在该行的一个失败,可以说只有85行被处理了预期的87.我会假设,上述行会读wrote 85 rows
事件。如何跟踪有多少行应在此情况下,已经处理了?我想看到类似wrote 85 of 87 rows
。基本上,我想我需要知道如何从源的查询返回的行数。是否有捷径可寻?
谢谢
您可以将数据源后使用Row Count transaformation
并保存它的变量。这将是要处理的行数。一旦它得到加载到目的地,你应该使用Execute SQL Task
在Control flow
和使用Select Count(*) from <<DestinationTable>>
并保存计数到其他变量[你应该使用WHERE子句在您的查询,以确定当前负载。所以,你将有处理记录行数。
希望这可以帮助!
在注释中没有足够的空间来提供反馈。发布一个不完整的答案,因为我需要离开的一天。
你将有麻烦完成你所要求的。基于在Gowdhaman008的回答您的意见,一个变量的值不是一个数据流之外可见,直到终结事件触发(OnPostExecute,我认为)之后。你可以欺骗,并得到这些数据,通过利用脚本任务的数行和发射了事件,自定义或预定义,以报告包的进展。事实上,刚刚捕获OnPipelineRowsSent
事件。这将记录多少行通过一个特定的时刻和时间周围。 SSIS Performance Framework另外,你不必做你的东西,任何自定义的工作或维护。开箱即用的功能,是一个明确的胜利。
这就是说,你是不是真的要知道有多少行出来的来源,直到它完成。这听起来很愚蠢,我完全同意,但是这是事实。想象一下,一个简单的例子,那就是要1,000,000行直接发送到OLE DB目标OLE DB源。最有可能的,并不是所有的1M行会在管道开始,也许只有10K将在第一缓冲器。这些缓冲区推到了目的地,现在你知道10K排出来的10K行已被处理。泡沫,冲洗,重复几次,在这个缓冲,行有一个空的地方不应该。轰去的炸药,进程失败。我们有60K行流入管道,这就是我们所知道的,因为失败的。
以确保我们已经占了所有源行的唯一方法是把一个异步转变成管道,以阻止所有下游组件,直到所有的数据已经到达。这会抹杀你获得不错的表现出你的包的任何机会。你仍然会受到上述限制上更新变量,但你FireXEvent消息会准确地描述有多少行可能在队列中被处理。
如果你开始一个明确的交易,你可以做一些丑陋的像一个执行SQL任务只是为了获得预期的计数,写一个变量,然后登录行处理,但此时你双倍查询数据并且增加阻塞的情形产生就因为双泵源系统。而这只是要的东西,像数据库工作。同样的概念也适用于平面文件除了现在你需要一个脚本任务先阅读所有行。
如果这得到丑陋是一个缓慢的启动数据源,如Web服务。默认的缓冲区大小可能会导致整个包运行更长的时间比它会需要简单,因为我们正在等待数据到达Slow starts
我会用行计数记录我starting and error counts(及以上)。这将帮助你占了所有进来的地方去的数据。然后我打开OnPipelineRowsSent
事件让我查询日志,看看有多少行流经它现在。
你想要的是Row Count transformation。只需添加到您的数据流的源查询后,其输出分配给一个变量。然后,你可以写一个变量的日志文件。
这是我目前做的。这是超级乏味,但它的工作原理。
2)我有所有的记录恒定的值“1”。他们是从字面上完全一样的。
3)使用多播步骤中,我发送数据在两个方向流出。尽管所有是相同的,我们仍然有由常数值进行排序。
4)使用聚合工序聚合上保持恒定,然后才能加入与底部的数据流(它拥有所有的实际数据记录,无聚集)诉诸它。
这样做可以让我有我的初始行数。
如果行数是不一样的,什么是错的。
这是解决你的问题,而无需使用其他数据流步骤方法的总体思路。
TLDR:
通过使用多播,排序由一些固定值,和聚合步骤得到的条件1中的行计数。
做一个排序和合并抢行计数。
使用条件分裂再做一遍。
如果前,后的行数是相同的,做到这一点。
如果前,后的行数是不一样的,做到这一点。
这可以帮助,如果您有它没有坏数据的列。添加第二个平面文件源的包。使用相同的连接为您现有的文件源。只选择第一列和直接输出到行数。