SSIS中DB2查询加载日期参数时出现Numeric Value out of range错误
解决SSIS调用DB2查询时的“Numeric Value out of range”错误
首先得说清楚,你遇到的这个问题核心是参数精度不匹配导致的,咱们一步步拆解原因和解决办法:
问题根源
你的测试日期值是2018-05-21 17:33:56.2463440——注意这里有7位小数的毫秒部分,但源表的last_update_ts是timestamp(6)类型,最多只支持6位小数。
为啥硬编码没问题?因为DB2会自动帮你截断多出来的那一位小数。但用SSIS参数传递时,SSIS的参数类型或者精度没和DB2的字段对齐,导致类型转换时直接触发了“数值超出范围”的错误。
另外提一句,你原查询里用逗号分隔表的写法属于旧版SQL语法,容易搞混连接逻辑,建议改成标准的JOIN语法,后面我会给你修正后的例子。
具体解决办法
1. 直接调整参数的小数位数
最简单的办法:把参数值的最后一位小数去掉,改成2018-05-21 17:33:56.246344(刚好6位小数),和DB2的timestamp(6)精度完全匹配,这样参数传递时就不会有转换问题了。
2. 修改SSIS参数的数据类型
打开SSIS的参数配置界面,检查参数的类型:
- 如果当前是
DT_DBTIMESTAMP2(支持最多7位小数),改成DT_DBTIMESTAMP(默认6位小数); - 或者如果SSIS支持的话,直接指定
DT_DBTIMESTAMP2(6),强制参数的精度为6位小数,和DB2字段对齐。
3. 在DB2查询里显式转换参数
要是没法修改SSIS的参数设置,那就在查询里对传入的参数做强制转换,把它转成timestamp(6)类型:
SELECT LPAD(i.abc, 13, '0') AS abc, LPAD(i.abc,9,'0') AS abc_short, -- 原查询里两个字段都叫abc会报错,建议改个别名 b.abc, i.abc, i.abc, i.abc, i.abc, i.abc, i.abc, i.abc, i.abc, sd.abc FROM abc.abci i LEFT OUTER JOIN abc.abc b ON i.abc = b.abc INNER JOIN abc.abc f ON i.abc = f.abc INNER JOIN abc.abc v ON i.abc = v.abc INNER JOIN abc.abc md ON i.abc = md.abc INNER JOIN abc.abc sd ON i.abc = sd.abc WHERE i.abc = 'A' AND i.abc = 'N' AND i.abc = 'Y' AND i.last_update_ts > CAST(? AS TIMESTAMP(6))
注:原查询里有两个
LPAD(i.abc, ...) AS abc,这会导致字段重名触发DB2报错,我给第二个字段加了abc_short别名,你可以根据实际需求调整。
4. 检查DB2连接管理器的类型映射
有时候SSIS的DB2连接管理器默认的类型映射会有问题,你可以打开连接管理器的“高级”设置,查看timestamp类型的映射规则,确保参数能正确转换为DB2兼容的格式。
验证步骤
- 先试试调整参数值到6位小数,看错误是否消失;
- 如果不行,检查SSIS参数的类型设置,确保和DB2字段精度一致;
- 最后尝试在查询里加显式转换,强制匹配
timestamp(6)。
内容的提问来源于stack exchange,提问作者Seshu




