如何强制SSIS按任务配置的特定数据类型读取Excel数据?
SSIS Excel遍历数据类型匹配问题解答
1. 数据类型重新检测的原因
你的假设是错误的。SSIS的Excel数据源不会记住开发阶段配置的数据类型,核心原因是Excel属于弱类型数据源,SSIS依赖Jet/ACE OLE DB驱动的默认逻辑:每次读取新文件时,都会扫描前8行(驱动默认值)推断列的主导数据类型,非主导类型的值会被强制转为NULL。即使开发时已指定类型,遍历不同文件时驱动仍会重新执行类型推断,导致数据读取异常。
2. 可行解决方案
针对你试过的方法无效的情况,以下是经过验证的解决步骤:
方法1:修改注册表调整类型推断规则
- 定位对应驱动的注册表路径:
- 32位驱动:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel - 64位驱动:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel
- 32位驱动:
- 修改
TypeGuessRows值为0(驱动会扫描整个文件推断类型,大文件可能影响性能),或设置为大于文件最大行数的数值;同时将ImportMixedTypes设为Text,强制混合类型列按文本读取。
方法2:正确配置IMEX参数的连接字符串
之前添加IMEX=1无效,大概率是格式错误。正确的连接字符串格式如下:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourTargetFile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1;"
注意:
IMEX=1必须放在Extended Properties内部,且引号嵌套要正确- 确保读取时Excel文件未处于打开状态,否则驱动会忽略IMEX设置
方法3:用脚本组件强制按文本读取
如果上述方法仍无效,可使用**脚本组件(作为数据源)**替代Excel数据源,通过代码强制读取InternalName列为文本:
- 添加脚本组件,选择“源”类型
- 在脚本编辑器中,使用
OleDbDataReader读取数据,读取InternalName列时直接转为字符串类型 - 输出列设置为字符串类型,将读取到的值直接赋值给输出列,绕过驱动的类型推断逻辑
方法4:预处理Excel文件格式
批量修改所有目标Excel文件的InternalName列格式为“文本”:选中对应列,设置单元格格式为文本后重新保存,SSIS读取时会直接识别为文本类型,避免类型推断问题。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

