为SSIS2012中的数据流中的每个任务捕获运行时

时间:2015-07-16 14:53:51

标签: ssis dataflow

在我的SSIS包中,我有一个类似于此的数据流。

enter image description here

我的要求是在SQL服务器表中记录每个flatfile目标的结束时间(或者每个平面文件的创建时间)。更清楚的是,日志表中每个flatfile将有一行。有没有简单的方法(最好)来实现这个目标?提前谢谢。

更新:我最终在数据流之后使用脚本任务,并读取数据流中创建的每个文件的创建时间。我还使用相同的脚本任务将日志插入表中,只是为了将事物保存在一个地方。有关详细信息,请将帖子掩盖为答案。

4 个答案:

答案 0 :(得分:1)

在仔细查看工具箱后,我认为最好的方法是将每个源/目标配对移动到自己的数据流中,并使用每个数据流的OnPostExecute事件写入SQL表。

答案 1 :(得分:1)

为了获得作为目标创建的每个平面文件的准确日期和时间戳,您需要创建三个新的全局变量,并在当前数据之后的控制流中设置for-each循环容器流程任务,然后向for-each循环容器添加一个脚本任务,该任务将从一个平面文件一次读取日期/时间信息。然后,该信息将保存到一个新的全局变量中,然后可以在第二个SQL任务(也在for-each循环中)中应用,以将信息写入数据库表。

以下链接提供了您需要应用的步骤的一个很好的示例。您可以轻松排除一些不适用的额外步骤。

http://microsoft-ssis.blogspot.com/2011/01/use-filedates-in-ssis.html

希望这会有所帮助。

答案 2 :(得分:1)

希望为@ TabAlleman的方法提供更多细节。 对于名称为Bene_hic的每个控制流任务,您将拥有源文件和目标文件。 在该可执行文件的'Event Handlers'标签上(使用下拉列表),您可以创建OnPostExecute事件。

在那种情况下,我有两个SQL任务。一个生成要为此控制流任务执行的SQL,第二个执行SQL。

这些SQL任务依赖于OnPostExecute事件中作用域的两个用户变量。两者的EvaluateAsExpression属性都设置为True。第一个Variable1用作SQL执行的模板,其值如下:

"SELECT execSQL FROM db.Ssis_onPostExecute 
where stgTable = '"  + @[System::SourceName]  +  "'"

@[System::SourceName]是一个SSIS系统变量,包含控制流任务的名称。

我的数据库中有一个名为Ssis_onPostExecute的表,其中包含两个字段,execSQL字段,其值为:

     DELETE FROM db.TableStats WHERE TABLENAME = 'Bene_hic';
        INSERT INTO db.TableStats 
             SELECT CreatorName ,t.tname, CURRENT_TIMESTAMP ,rcnt  FROM 
        (SELECT databasename, TABLENAME AS tname, CreatorName FROM dbc.TablesV) t  
        INNER JOIN
        (SELECT 'Bene_hic' AS tname, 
COUNT(*) AS rcnt FROM db.Bene_hic) u ON
             t.tname = u.tname 
    WHERE  t.databasename = 'db' AND t.tname = 'Bene_hic';

stgTable字段,其中包含相应控件流任务的名称(区分大小写!),如Bene_hic

在第一个SQL任务(名为SQL)中,我将SourceVariable设置为用户变量(User::Variable1),并将ResultSet属性设置为{{1结果集详细信息包含'single row.' = Result Name0作为第二个用户变量(Variable name。)

在第二个SQL任务(User::Variable2)中,我将exec属性设置为SQLSourceType,将Variable属性设置为SourceVariable

然后包可以将源对象中的数据复制到目标,无论它是否失败,在表中输入一行,其中包含时间戳和复制的行数,以及表名和其他任何内容你想跟踪。

此外,在调试时,您必须运行整个程序包,而不仅仅是事件中的一个任务。否则,变量将无法正确设置。

HTH,通过几个网站上的示例,我花了很长时间才把所有这些东西都弄清楚了。我使用代码在User::Variable2字段中为42个控制流任务中的每一个生成SQL,这意味着我创建了84个用户变量。

-Beth

答案 3 :(得分:1)

简单的解决方案是: 1)在Fatfile目标之后拖动工具箱中的OLE DB Command。 2)Update Scriptcurrent date目的地成功时用Flat file更新表格。 3)您可以使用值variable创建systemdatetime(范围是项目)。 4)如果成功或失败,您可能必须创建另一个variable,具体取决于您的包构造