65.9K
CodeProject 正在变化。 阅读更多。
Home

在 SSIS 中, 如何即使内部任务失败也继续执行 for each 循环容器( 在 SSIS 中使用 Propogate Property)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (4投票s)

2012年5月16日

CPOL

4分钟阅读

viewsIcon

117619

即使其中的任务失败,我们如何配置 Foreach 循环容器?

引言

如果任何内部任务失败,我们如何配置 Foreach 循环容器?这种情况可能不常见,但有时我们可能需要将 Foreach 循环容器配置为处理这种情况。

背景

假设您有一个应用程序,需要根据 ID 循环遍历某个日志表并将数据加载到目标中。现在,在这种情况下,Foreach 循环容器中的一些任务可能会失败。但是您的要求是,即使内部任务失败,我们也应该处理我们可用的其他源。

使用代码

  1. 添加一个新的包,将其命名为“ContinueExecutionOfFailedForEachLoop”。
  2. 在这个例子中,我使用的是用于文件枚举器的 Foreach 循环。
  3. 创建两个变量“varFullFile”,这将存储您循环时的完整文件路径。
    例如:“C:\MSBI_Training_Materails\Source\Test.txt”
  4. 另一个变量为“varFile”,我们将在此处存储源路径。
    例如:“C:\MSBI_Training_Materails\Source\
    我会告诉你为什么我们创建了两个变量。
  5. 添加一个 Foreach 循环容器并将其命名为“FELC_Text_Files”,现在我们将配置 Foreach
    循环容器,如下面的屏幕截图所示

Foreach File Enumerator

  1. 双击 Foreach 循环容器,转到“集合”选项卡。
  2. 在“枚举器”中选择“Foreach 文件枚举器”。
  3. 现在在“枚举器配置”中,选择源文件夹的路径。
  4. 在“文件”中,将文件类型指定为“Test*.txt”。此步骤将确保仅处理从源文件夹中以“Test”开头且扩展名为“.txt”的文件。
  5. 现在,转到“变量映射”选项卡并显示图像。

  1. 在此选项卡中,选择我们创建的变量“varFullFile”。这将包含完整路径以及带有扩展名的文件名。
  2. 这将配置您的 Foreach 循环容器。
  3. 现在,我们将一些源文件添加到我们的源文件夹中,结构如下所示。

    ID,Val 
    1,2
    2,3
    3,4
    4,5
    5,6
    6,7

    您可以创建 4 到 5 个具有相同结构的源文件,并将每个文件命名为 Test1、Test2 等。
  4. 现在拖放一个数据流任务,将其命名为“DFT_TransferTextFiles”。
  5. 在数据流中,添加平面文件源并将其命名为“SRC_Text_Files”。
  6. 这将在“连接管理器”区域创建一个新的平面文件连接,将其重命名为“TestConn”。
  7. 这是我们的源连接字符串。现在转到 TestConn(即平面文件连接)的属性。
  8. 转到表达式,从属性中选择“连接字符串”属性。
  9. 在表达式生成器中,拖动变量“varFullFile”并计算表达式。这将显示完整的文件路径和文件名。

  1. 现在拖放平面文件目标并将其重命名为“DESTN_Text_Files”。
  2. 这还将在“连接管理器”区域创建一个新的平面文件连接,将其重命名为“Destn Test”。
  3. 现在转到“Destn Test”连接字符串的属性,再次选择“连接字符串”属性。
  4. 在表达式生成器中给出以下表达式
  5. @[User::varDestnFileName]+ "Destn"+REPLACE( @[User::varFullFile], @[User::varFile] , "")


  1. 我们这样做是为了在目标处获取不同的文件,我们将将其命名为“DestnTest1”,其中 Test1 是
    源文件名。
  2. 我们之前创建的源文件中,我们现在将在第三个文件中引入一些错误,如下所示。

    ID,Val
    1,2222222222222222222222222222222222222222222222222222222222222222222
    2,3333333333333333333333333333333333333333333333333333333333333333333
  3. 这将确保我们的包因截断错误而失败。
  4. 现在执行包,执行时您将看到对于第三个文件,包失败了。
  5. 现在,要即使在失败后也能执行 Foreach 循环容器,我们需要执行以下步骤。
  6. 选择数据流任务,转到事件处理程序。

  1. 启用“OnError”事件处理程序。
  2. 在“事件处理程序”选项卡中,单击“显示系统变量”。
  3. 现在选择“Propogate”属性并将它的值更改为“False”。

  1. 这将确保父控件(即 Foreach 循环)不会知道子任务中的错误。
  2. 设置此属性后,尝试执行包。现在,以前失败的同一个包将运行而不会出现任何错误。
  3. 现在开发人员有责任跟踪发生的错误。
  4. 请注意,假设在 Foreach 循环容器中您有 4 到 5 个任务,那么在这种情况下,我们可以添加一个序列容器。所有子任务都将放在此序列容器中。
  5. 然后,我们将在序列容器上启用事件处理程序,并将它的 Propogate 属性设置为 False。这是完成此任务的快捷方式,否则我们必须分别配置每个子任务的 Propogate 属性。

关注点

当我们将 Propagate 属性设置为 False 时,父控件将不知道子任务中的失败。

链接

http://simonworth.wordpress.com/2009/11/11/ssis-event-handler-variables-propagate/.
© . All rights reserved.