SSIS将一个表中的所有数据导出到多个文件中

时间:2014-07-07 13:59:00

标签: loops foreach ssis export

我有一个名为customers的表,其中包含大约1,000,000条记录。我需要将所有记录传输到8个不同的平面文件,这些文件会增加文件名中的数字,例如cust01cust02cust03cust04等。

我被告知可以在SSIS中使用for循环完成此操作。请有人给我一个指导,帮助我实现这一目标。

这背后的逻辑应该是"计数行数","除以8","将这些行导出到8个文件中的每一个&# 34。

2 个答案:

答案 0 :(得分:7)

对我来说,创建一个循环并计算数据量然后查询前N个段或其他任何内容的包将会更复杂。

相反,我只需创建一个包含9个连接管理器的包。一个到您的数据数据库(源),然后是8个相同的平面文件连接管理器,但使用FileName1,Filename2等模式。定义第一个FFCM后,只需复制,粘贴和编辑实际文件名。

将数据流任务拖到控制流上,并将其连接为OLE / ADO / ODBC源。使用查询,不要选择表,因为您需要对数据进行分区。我假设你的底层RDBMS支持ROW_NUMBER()函数的概念。您的源查询将是

SELECT 
    MT.*
,   (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) % 8 AS bucket
FROM 
    MyTable AS MT;

该查询将撤回所有数据,并指定从1到ROWCOUNT的单调递增数字,然后我们将模数(除数后的余数)运算符应用于。通过将生成的值修改为8,可以保证我们只能获得0到7的值,包括端点。

你可能会开始对这里使用的不同数字基数(基数0,基数1)感到不安,我知道我是。

将您的来源连接到条件分割。使用bucket列将数据细分为不同的流。我建议您将存储桶1映射到文件1,存储桶2映射到文件2 ...最后使用存储桶0映射到文件8.这样,我只需处理端点对齐,而不是一切都是台阶。

将每个流连接到一个平面文件目的地,繁荣就是炸药。

答案 1 :(得分:-1)

你可以创建一个带有脚本组件的rownumber(不用担心):http://microsoft-ssis.blogspot.com/2010/01/create-row-id.html 或者你可以使用像http://microsoft-ssis.blogspot.com/2012/03/custom-ssis-component-rownumber.htmlhttp://www.sqlis.com/post/Row-Number-Transformation.aspx

这样的rownumber组件

要将其分为8个文件,您可以使用Balanced Data Distributor或带有模数表达式的Conditional Split(使用新的rownumber列): enter image description here

enter image description here