【问题标题】:Foreach Loop Container For Data Flow Task用于数据流任务的 Foreach 循环容器
【发布时间】:2012-06-16 01:00:57
【问题描述】:

我想从 oracle DB 导入近 1200 万条记录,但由于 SSIS 内存缓冲区问题,我需要每年迭代我的数据流任务,即 2005 年到 2012 年(7 次)。我如何使用 foreach 我的 oracle 查询逐年获取数据。

查询

SELECT * FROM EMP_RECORDS_DETAILS WHERE to_char(JOIN_DT,'YYYY')=2005

【问题讨论】:

  • 如果你知道你的日期范围,为什么你需要一个 for each 循环容器?您不能简单地执行 select * from table where DATEPART(YY,JOIN_DT) > '2005' 之类的操作吗??

标签: sql sql-server oracle ssis


【解决方案1】:

我已经使用 Sql Server 解决了上述问题。所以你唯一需要改变的是选择查询

  1. 首先创建一个变量来存储每年的日期。

     Name: TimeValue  DataType=Int32
    
  2. 使用 ForEach 循环并在集合选项卡中选择 Foreach 项枚举器

  1. 单击“列”选项卡并创建数据类型为 int 的新列

  2. 在变量映射中映射上面创建的变量。

  1. 在数据流内部使用 oledb 目标并在数据访问模式下选择 sql 命令。应更改 where 子句中的查询并尝试选择列而不是提供 *。

  1. 点击参数选项卡映射为foreach循环创建的参数

如果之前不知道日期的值,则可以在 foreach 循环之前使用执行 sql 任务,并从表中仅选择 dateTime 列值并将其存储在变量中,并在 foreach 循环中使用来自变量枚举器的 Foreach在集合选项卡中,选择上面创建的变量执行sql任务。

希望对你有所帮助。

【讨论】:

  • 谢谢普拉文。我认为应该工作。我正在根据您的建议修改我的包裹
  • 我认为这不是一个好主意,除非您想在内存中存储所有 1200 万条记录。
  • 这里我没有将记录存储在内存中。在问题中,OP 的 SSIS 内存存在问题,因此他将进入 FOREACH 循环以一次处理一组记录
  • @Rajiv:你有没有遇到过这种导入大量记录的情况。你认为这种方法有没有余地。
  • 使用此方法加载 1200 万条记录的方法更多是不必要的工作。每月/每年一次加载的逻辑是什么? SSIS 将只处理它可以在其缓冲区中保存的数据量。如果不能,并不意味着它会失败。它只会等到缓冲区被清除,以便它可以加载新数据。为什么你认为使用 for-each 循环容器是高效的'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
相关资源
最近更新 更多