如何用SSIS 2016导出超100万行数据至Excel?
SSIS处理超100万行数据拆分到Excel多工作表方案
针对SSIS+SQL Server 2016导出超100万行到Excel 2016的场景,以下是两种实用方案:
方法一:动态循环拆分(适合任意行数)
这是最灵活的方案,能根据实际行数自动生成对应数量的工作表:
- 预处理总记录数:在控制流加「执行SQL任务」,执行查询获取总行数,计算需要的工作表数量(Excel 2016单表最大行是1048576),把结果存到变量
@TotalSheets、@RowPerSheet(固定设为1048576)。 - 循环处理每个分片:添加「Foreach循环容器」,循环次数绑定
@TotalSheets,用变量@CurrentSheetIndex标记当前工作表序号。 - 数据流内分页查询:循环内部加「数据流任务」:
- OLE DB源用带行号的分页SQL,比如:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY 主键列) AS RowNum FROM 你的数据源表 ) t WHERE RowNum BETWEEN (@CurrentSheetIndex-1)*@RowPerSheet +1 AND @CurrentSheetIndex*@RowPerSheet - Excel目标的连接字符串用表达式动态指定工作表名,比如工作表名设为
"Sheet" + (DT_WSTR,3)@CurrentSheetIndex,务必勾选「延迟验证」,避免设计时因找不到工作表报错。
- OLE DB源用带行号的分页SQL,比如:
- 动态创建工作表:如果目标工作簿不存在对应工作表,可在循环开头加「执行SQL任务」,连接Excel连接管理器,执行建表语句:
这里的CREATE TABLE `Sheet1` (列名1 VARCHAR(50), 列名2 INT, ...)Sheet1要替换成动态生成的表名。
方法二:固定条件拆分(适合行数范围可预估)
如果能确定数据不会超过N个1048576行,直接用数据流拆分:
- 添加行号生成:在数据流的数据源之后加「派生列」组件,生成
RowNum列(用ROW_NUMBER()或者脚本组件实现)。 - 条件拆分数据:加「条件拆分」组件,按行号范围拆分输出:
- 第一个输出条件:
RowNum <= 1048576 - 第二个输出条件:
RowNum > 1048576 && RowNum <= 2097152 - 按需增加更多分支
- 第一个输出条件:
- 对应Excel目标:每个拆分输出连接到一个Excel目标,提前在工作簿建好对应工作表(比如Sheet1、Sheet2),或者用脚本任务预先创建。
关键注意事项
- 必须使用Microsoft Access Database Engine 2016驱动,避免版本不兼容导致的写入失败。
- 变量数据类型要匹配:比如
@CurrentSheetIndex用整数,拼接工作表名时转成字符串类型。 - 若使用64位SSIS,要确保驱动也是64位,否则会出现连接失败问题。
内容的提问来源于stack exchange,提问作者SidC
相关产品推荐
相关产品推荐

