Foreach循环容器用于数据流任务

4

我希望从Oracle数据库中导入近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'吗? - rvphx
1个回答

6
我已经使用Sql Server解决了上述问题。所以你需要更改的唯一内容就是Select查询语句。
  1. First Create a variable to store the date for each year .

     Name: TimeValue  DataType=Int32
    
  2. Use a ForEach Loop and select Foreach Item enumerator in the collection tab

新建列

  1. 点击“列”选项卡,创建一个数据类型为int的新列。

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

映射

  1. 在数据流内部使用OLE DB目标,在数据访问模式中选择SQL命令。更改where子句中的查询,并尝试选择列而不是使用*。

SQL查询

  1. 点击参数选项卡,映射用于foreach循环的参数。

映射参数

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

希望这能对你有所帮助。


谢谢Praveen。我认为应该可以。我正在根据您的建议修改我的程序包。 - Pratik
1
我认为这不是一个好主意,除非你想在内存中存储所有的1200万条记录。 - rvphx
使用这种方法加载1200万条记录的方式更多是不必要的工作。为什么要一次加载每个月/年的数据?SSIS只会处理它可以在缓冲区中容纳的数据量。如果不能容纳,它并不意味着它会失败。它只会等待缓冲区被清空,以便它可以加载新数据。你认为使用for-each循环容器是高效的原因是什么? - rvphx
这个答案救了我的一天。我可以解释在什么情况下可能需要这样做。比如说你必须使用一个select查询来插入一个表,但是这个select查询非常耗费时间,可能需要几个小时才能返回一行数据给你!所以你决定使用一些where子句来选择数据块,然后再插入它们。但是这些where子句可能不均匀。最好进一步批量插入 - 这就是这个问题的目的。在我的情况下,大约有1.1亿条记录! - Kumar Vaibhav
@praveen,我的SSIS也遇到了类似的问题,你能帮我吗? - Gerardo
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接