【问题标题】:How to handle an empty query result on a DataFlow Task?如何处理 DataFlow 任务上的空查询结果?
【发布时间】:2012-01-04 19:51:18
【问题描述】:

我在 Foreach 循环中使用数据流迭代了几年,但有些年份不会返回任何数据,因此它们的 SSIS 包失败,有没有办法处理这个问题?告诉包忽略这些空白并继续执行?

谢谢,

【问题讨论】:

  • 你将什么传递给 foreach 循环,你在 foreach 循环中有什么?请在您的帖子中添加更多详细信息。这将有助于加载..
  • 我是 foreach 循环的传递和对象变量,在 foreach 循环内我有一个数据流任务(ole db 源和目标)在查询中使用该变量,它们是变量(使用 foreach) 工作正常,但例如如果查询使用没有数据的年份(变量),则任务失败。我要处理不返回数据的情况
  • 仅供参考,我的意思是如果查询类似于“从 sysobjects where = 中选择 *?”并且没有失败那一年的数据

标签: ssis bids dataflowtask


【解决方案1】:

如果您不想了解如何将数据传递给Foreach 组件,您可以采取一种方法:

  1. 您可以在Foreach 容器中包含一个额外的Execute SQL Task 组件,该组件首先检查是否有任何数据要处理。

  2. 创建一个变量,您的 SQL 任务会将记录计数设置为该变量,例如 @cntProceed

  3. 将此组件设置为在您的 Dataflow 任务之前运行。

  4. 修改优先约束(从 SQL 任务到 Dataflow 任务的绿色箭头)。将evaluation operation 设置为Expression and Constraint,将Value 设置为Success,将Expression 设置为@cntProceed != 0

这一切的作用:在 foreach 组件/容器中,它首先会检查是否存在任何可使用的数据。这就是附加组件要做的事情,如果有数据要使用,它将进入数据流组件。否则,"each"(或者更确切地说......那个循环)将结束,Foreach 将移动到下一个循环。

【讨论】:

    【解决方案2】:

    如果查询返回 0 行,我不确定为什么数据流会失败。一种可能的解决方案是询问有效年份的数据,并且只遍历有效年份。这可以通过以下方式完成:

    1. 在 ForEach 循环容器之前创建一个执行 SQL 任务
    2. 将 ResultSet 设置为执行 SQL 任务的完整行
    3. 将结果集选项卡设置为对象变量
    4. 将 ForEach 循环容器设置为 ForEach ADO 枚举器
    5. 将 ADO 对象源变量设置为对象变量
    6. 将变量映射设置为年度变量
    7. 将年份作为参数传递给数据流。

    您可以查看包装上的代码并发布吗?我很乐意看看我是否可以复制您遇到的问题并为您提供更直接满足您发布的需求的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      相关资源
      最近更新 更多