如何用SSIS将多文件夹中的多份Excel文件导入SQL Server表?
SSIS批量导入多文件夹Excel/CSV到SQL Server的解决方案
一、解决仅.csv导入、.xlsx未加载的问题
- 检查Excel Source连接配置
- Excel 2019文件必须选择
Microsoft Excel 2016-2019版本(连接管理器的“Excel版本”下拉框),别选旧版的Excel 97-2003,否则识别不了.xlsx文件。 - 手动编辑连接字符串时,要包含
Extended Properties="Excel 12.0 Xml;HDR=YES;",这是.xlsx文件的标准扩展属性,缺了会导致连接失败。
- Excel 2019文件必须选择
- 拆分Excel和CSV的处理逻辑
- 在Data Flow里加
Derived Column组件,用TOKEN(@[User::CurrentFileName],".",-1)提取文件扩展名,再用Conditional Split组件判断:如果是.xlsx走Excel Source,.csv走Flat File Source(CSV用Flat File Source比硬套Excel Source更稳定)。 - 优先处理.xlsx的话,把
.xlsx的分支条件放在Conditional Split的最前面,确保先加载Excel文件。
- 在Data Flow里加
- 排查错误输出日志
- 打开Flat File Destination里的错误日志,看看.xlsx文件是不是因为列名、数据类型和SQL Server目标表不匹配,被错误路由到了错误文件,没写入OLE DB。
二、解决For Each Loop仅遍历单个文件夹文件的问题
- 正确配置For Each Loop枚举器
- 选
Foreach File Enumerator,在“集合”选项卡:- 根文件夹选最上层目录,必须勾选**“遍历子文件夹”**,不然只会扫当前文件夹的文件,不会递归子文件夹。
- 文件筛选栏填
*.xlsx;*.csv,确保只加载目标格式文件,也可以分开两次循环,先扫*.xlsx再扫*.csv,强化优先加载Excel的逻辑。
- 选
- 绑定变量实现动态文件切换
- 建一个用户变量(比如
User::CurrentFilePath,类型设为String,长度设长点),让For Each Loop把遍历到的完整文件路径赋值给这个变量。 - 在Excel和Flat File连接管理器的属性里,给
ConnectionString加表达式,绑定到@[User::CurrentFilePath],这样每次循环都会自动切换到下一个文件,不会一直用初始配置的文件。
- 建一个用户变量(比如
- 检查容器嵌套关系
- 必须把整个Data Flow Task放到For Each Loop容器里面,要是Data Flow在容器外面,包只会执行一次,自然只加载一个文件。
额外验证步骤
- 开调试模式运行,盯着
CurrentFilePath变量的实时值,确认是不是真的遍历到了所有目标文件夹里的文件。 - OLE DB Destination选
表或视图 - 快速加载模式,根据目标表结构勾选“检查约束”“启用标识插入”,避免因为写入模式限制导致数据没写入。 - 核对SQL Server目标表和源文件的列结构:列名要对应,数据类型要匹配(比如Excel的日期列对应SQL的
DATE或DATETIME,数值列对应INT或DECIMAL),类型不匹配会导致数据被过滤或报错。
内容的提问来源于stack exchange,提问作者Rina Hafizhah
相关产品推荐
相关产品推荐

