【问题标题】:SSIS - Execute task in foreach loop only onceSSIS - 在foreach循环中只执行一次任务
【发布时间】:2014-06-18 06:46:26
【问题描述】:

我需要一些帮助来解决以下问题:

在 foreach 循环中,我有一个数据流任务,它从集合文件夹中读取每个文件。如果在处理某个文件时失败,则将该文件复制到错误文件夹(使用名为“将工作复制到错误”的文件系统任务)。

我想设置一个发送电子邮件任务,如果在包执行期间有任何文件发送到错误文件夹,则会向我发出警告。
我可以在“将工作复制到错误”任务之后轻松添加此任务,但如果有很多文件未能通过数据流任务,我的收件箱就会被填满。

相反,只有在“将工作复制到错误”任务至少执行一次时,我才希望发送邮件任务一次(在 foreach 循环完成后)。有什么办法可以实现吗?

谢谢,

奥维迪乌

【问题讨论】:

  • 您希望在电子邮件中提供哪些详细信息?只有一个或多个文件或文件名等处理失败?
  • 一个简单的警告信息就可以了。

标签: foreach ssis


【解决方案1】:

这是我能想到的一种方式:

  1. ForEach容器外创建一个整数变量@Total并将其设置为0。
  2. ForEach 容器内创建一个整数变量@PerIteration
  3. Script Task 作为事件处理程序添加到File System Task。此任务应将@Total 增加@PerIteration
  4. ForEach 容器之后添加您的SendMail 任务。在优先约束中,将类型设置为Expression,并指定条件@Total > 0。这应该确保只有在循环中至少执行了一次 File System Task 时才会触发您的任务。

【讨论】:

  • 感谢您的回复。我不熟悉使用脚本,所以任何额外的提示将不胜感激。
  • 脚本可以是 C# 或 VB.Net 代码。您可以处理脚本中的变量甚至 SSIS 对象,也可以像在普通程序中一样处理其他事情。
【解决方案2】:

您可以只使用一个布尔变量来实现这一点,比如在 for each 循环范围之外创建的 IsError,默认值为 False。您可以在使用表达式任务 (SSIS 2012) 或执行 SQL 任务将工作复制到错误任务成功后立即将其设置为 True。最后,您的 Send Mail 任务将连接到 For Each 循环,并将优先约束设置为 Expression - isError。

【讨论】:

  • 不幸的是,我不能使用表达式任务(SSIS 2008),但我想我会接受你的第二个建议(使用执行 SQL 任务),因为我发现它是最容易实现的。谢谢。
【解决方案3】:

发生错误时,在表格中创建一条记录,其中包含您希望包含在电子邮件中的信息 - 例如。 1.完整路径失败的文件 2.具体错误 3. 日期/时间

然后在包裹的最后,发送一封合并的电子邮件。这样一来,如果您想重新访问该问题,或者如果电子邮件丢失/未送达,您就有了一个可以求助的中心位置。

如果您需要实施帮助,请返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多