在 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
= 0
和 Variable name
作为第二个用户变量 (User::Variable2
.)
在第二个 SQL 任务中 (exec
,) 我将 SQLSourceType
属性 设置为 Variable
和 SourceVariable
属性 设置为 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
在我的 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
= 0
和 Variable name
作为第二个用户变量 (User::Variable2
.)
在第二个 SQL 任务中 (exec
,) 我将 SQLSourceType
属性 设置为 Variable
和 SourceVariable
属性 设置为 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