SSIS迁移至SQL Server 2022后ADO.NET目标报ArgumentOutOfRangeException
SSIS Decimal字段溢出异常(Win2022+SQL2022环境)
问题复现
- 原环境:Windows Server 2012 + SQL Server 2017,SSIS项目运行正常
- 新环境:Windows Server 2022 + SQL Server 2022,修改项目属性
TargetServerVersion为2019/2022后,数据流中ADO.NET目标组件报错:ADO NET Destination Error: System.ArgumentOutOfRangeException
- 关键现象:
- 数据源为IBM ODBC连接,查询预览结果正常,但运行时decimal字段数值完全混乱,最终触发溢出错误
- 更换OLE DB等其他目标组件、切换新旧微软驱动均无法解决
- 保持
TargetServerVersion为2017时,项目运行无异常
排查与解决建议
强制指定Decimal字段精度与小数位数
在ODBC数据源的查询语句中,显式转换decimal字段的精度,避免SSIS自动推断时出现版本兼容问题。例如:SELECT CAST(your_decimal_column AS DECIMAL(18,4)) AS your_decimal_column FROM your_source_table同时在数据流的源组件中,手动设置该字段的数据类型为匹配的Decimal类型,不要依赖自动检测。
调整SSIS项目的数据流验证级别
项目属性中,将ValidationLevel从Full改为Basic,避免高版本SSIS对数据类型进行更严格的验证导致推断错误。修改路径:项目属性 -> 配置属性 -> 调试 -> ValidationLevel。开启ODBC连接兼容性模式
在IBM ODBC驱动的连接配置中,启用针对旧版本SQL Server的兼容选项(若驱动提供),强制驱动使用与SQL2017兼容的数据类型映射规则。添加显式数据转换步骤
在数据流中插入【数据转换】组件,将源端decimal字段再次转换为目标表所需的Decimal类型,中间固定精度和小数位数,跳过SSIS自动类型映射环节。核对目标表Decimal字段定义
SQL Server 2022对decimal类型的溢出检测逻辑有细微调整,确认目标表的decimal字段精度、小数位数与源端完全一致,避免因目标字段容量不足触发异常。
内容的提问来源于stack exchange,提问作者MikWou
相关产品推荐
相关产品推荐

