SSIS的检查点文件用法
2008-01-24 17:11:53 来源:IT专家网 作者:戴羽 点击:
SQL Server集成服务提供了一个在某种程度上自动从失败处重启处理的机制。这个机制是通过使用检查点文件来提供的。它帮助我们配置ETL解决方案在发生一个执行错误后的执行流。这篇文章解释了检查点文件和集成服务的一些有用任务的使用。
ction2.txt 文件。一旦这个文件可用了我们可以再次运行这个包,但是最大的问题是,它再次运行了第一个任务并再次加载了Transaction1.txt。因此,它可能导致数据(或业务)错误或冗余(如果转换/转移执行了)。这就是我们所希望避免的,也是我们要使用检查点文件的地方。如果包执行失败了,我们需要从失败处重启这个包,而不是从头开始。
让我们来进行配置。如下所示地改变属性:

让我们再次运行这个包。确保源文件夹只包含了Transaction1.txt 文件。就像第一次一样,在第二个任务后包运行失败了。现在打开保存检查点文件的文件夹。你将看到创建了SamplePackageCheckpoint.xml。之所以创建了这个文件是由于我们将包中的SaveCheckpoints值设置为True。因为包执行失败所以没有删除这个文件。执行失败是由于加载Transaction2 文件的FailPackageOnFailure 属性设置为True了。
将Tranaction2.txt 文件放置在源文件下并运行这个包。你将看到包从加载Tranaction2文件任务开始并继续执行:

它从第三个任务开始,因为检查点文件指导它这么做,而包使用了这个检查点文件因为CheckpointUsage属性设置为IfExists了。如果你检查检查点文件所在的文件夹,那你现在不会看到这个文件了。它已经被删除了,因为包执行成功了。
在for loop中的检查点用法
使用for loop 的检查点设置是不同的。我尝试在一个ETL测试应用程序中执行它时遇到了这个问题。为了了解它,让我们试一些简单的代码。
打开一个新的SSIS项目并添加一个For Loop 容器。创建一个叫做Year的变量并设置类型为Int32。设置Year的默认值为2004。假设这样一个场景:你需要从一个给定的年份做一些处理到当前的年份。所以给定的年份是变量Year 的值。添加一个脚本任务到显示了这个处理的For Loop 容器上。在ScriptTask的ReadOnlyVaribles中添加变量Year,并添加一个信息框,它显示了如下信息:
以下是引用片段:
' code 1
MsgBox("Calculation done for year " & Dts.Variables("User::Year").Value.ToString() & ".")
Dts.TaskResult = Dts.Results.Success |
现在如下所示地配置For Loop 容器。注意我们在InitExpression上不设置@Year 的值。初始值会从变量那里得到。

完成了!运行这个包。你将看到2004、2005、2006和2007年的信息。现在让我们开始配置检查点文件。如下所示地设置属性:
因为我们需要在某一点上让包执行失败,所以改变脚本任务的代码,如下所示:
以下是引用片段:
' code 2
If (CInt(Dts.Variables("User::Year").Value) = 2005) Then
MsgBox("Error occurred while processing for " & Dts.Variables("User::Year").Value.ToString() & ".")
Dts.TaskResult = Dts.Results.Failure
Else
MsgBox("Calculation done for year " & Dts.Variables("User::Year").Value.ToString() & ".")
Dts.TaskResult = Dts.Results.Success
End If |
再次运行这个包。这个包在执行2004年后失败。你将看到检查点文件已经创建了而且没有被删除。改变脚本任务的代码如它原来的样子(代码1)。因为