我有一个ssis包,其中包含一个foreach容器来循环遍历文件并将其加载到表中。现在我想跟踪进程的开始时间,结束时间和状态到另一个表中。我怎样才能实现这个目标..?
答案 0 :(得分:2)
创建2个全局变量 - 一个用于开始时间,一个用于结束时间。 使用在foreach容器之前运行的脚本任务来设置开始时间变量,以及在foreach容器之后运行的另一个脚本任务来设置结束时间变量。之后,使用派生列数据流转换将开始和结束时间输入管道非常简单,以便您可以保留它们。
在脚本任务中不要忘记引用变量,脚本应该如下所示:
public void Main()
{
DateTime currentDate = DateTime.Now;
Dts.Variables["StartDate"].Value = currentDate;
Dts.TaskResult = (int)ScriptResults.Success;
}
此处也可以找到另一种方法:How can a step in an SSIS package check for the time?但这只会让您获得开始时间,而不是结束时间。
答案 1 :(得分:1)
这个问题并不是一个优雅的解决方案,但你可以试试这个。
创建包含单个或组包含任务的单独包,从监视Stopwatch对象的脚本任务中加载和执行它。
public void Main()
{
Application dtsRuntimeApp = new Application();
Package dtsPackage = dtsRuntimeApp.LoadPackage(@"PackageFileName.dtsx", null);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
dtsPackage.Execute();
stopwatch.Stop();
var totalElapsedTime = stopwatch.Elapsed; // package timing here.
}
答案 2 :(得分:0)
我希望您使用SSIS 2012.
在SSISDB
中,可以使用一组视图。这些给了我们执行包的每个细节。您可以从下面的sql编辑。 (只是一个例子)
SELECT E.execution_id,
E.project_name,
E.package_name,
S.start_time,
S.end_time
FROM [SSISDB].[catalog].[executions] E
JOIN [SSISDB].[catalog].[executables] EX ON E.execution_id = EX.executable_id
JOIN [SSISDB].[catalog].[executable_statistics] S ON E.execution_id = S.execution_id