在 SSIS 2012 的数据流中捕获每个任务的运行时

Captuing runtime for each task within a dataflow in SSIS2012

在我的 SSIS 包中,我有一个看起来像这样的数据流。

我的要求是在 SQL 服务器 table 中记录每个平面文件目标的结束时间(或创建每个平面文件的时间)。更清楚地说,日志中每个平面文件将有一行 table。有什么简单的方法(最好)可以做到这一点吗?提前致谢。

更新: 我最终在数据流之后使用脚本任务并读取数据流中创建的每个文件的创建时间。我还使用相同的脚本任务将日志插入 table,只是为了将内容保存在一个地方。有关详细信息,请参阅 post masked as answer。

仔细查看工具箱后,我认为最好的方法是将每个 source/destination 对移动到它自己的数据流中,并使用每个数据流的 OnPostExecute 事件写入 SQL table.

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

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

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

希望这对您有所帮助。

想为@TabAlleman 的方法提供更多细节。 对于每个名称如 Bene_hic 的控制流任务,您将有一个源文件和一个目标文件。 在该 executable 的 '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 的 table,它有两个字段,一个 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 属性 设置为 'single row.' 结果集详细信息包括 Result Name = 0Variable name 作为第二个用户变量 (User::Variable2.)

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

然后包就能够将源对象中的数据复制到目标,无论失败与否,在 table 中输入一行,其中包含时间戳和复制的行数,以及table 名称和您要跟踪的任何其他内容。

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

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

-贝丝

简单的解决方案是: 1) 从工具箱中将 OLE DB Command 拖到 Fatfile 目标后。 2) 当 Flat file 目的地成功时,Update Script 将 table 更新为 current date。 3) 您可以创建一个 variable(范围是项目),值为 systemdatetime。 4) 如果成功或失败

,您可能必须根据您的包结构创建另一个 variable