如何强制SSIS输出平面文件时使用数值类型而非双精度浮点数?
解决SSIS平面文件目标数值字段无前置零及小数格式异常问题
问题核心
输入列是精度5、小数位2的DT_NUMERIC,但平面文件目标的外部列自动变为DT_R8,导致0输出.00、0.17输出.17,无法满足保留两位小数且带前置零的要求。
方案一:强制外部列使用DT_NUMERIC类型(解决自动恢复问题)
平面文件连接管理器的自动类型推断是导致外部列类型重置的关键,需从连接管理器层面修改设置:
- 打开对应的平面文件连接管理器,切换到「高级」选项卡
- 找到目标数值列,将数据类型改为
DT_NUMERIC,同时设置精度为5、小数位数为2 - 切换到「常规」选项卡,取消勾选重新检查列(若存在该选项),防止包加载时自动推断类型覆盖手动配置
- 保存连接管理器设置后,回到平面文件目标组件,确认外部列类型已同步为
DT_NUMERIC
方案二:通过派生列组件格式化数值为字符串(最可靠的格式控制)
若类型强制仍无效,可将数值转换为指定格式的字符串后输出:
- 在数据流任务中,在数据源与平面文件目标之间添加派生列组件
- 针对目标数值列(假设列名为
TargetColumn),添加派生列,使用以下表达式之一:- 兼容旧版SSIS的表达式(无需依赖FORMAT函数):
(DT_WSTR,10)(ROUND(TargetColumn,2)) == ".00" ? "0.00" : (LEFT((DT_WSTR,10)(ROUND(TargetColumn,2)),1) == "." ? "0" + (DT_WSTR,10)(ROUND(TargetColumn,2)) : (DT_WSTR,10)(ROUND(TargetColumn,2))) - SQL Server 2012及以后版本可使用更简洁的
FORMAT函数:FORMAT(TargetColumn, "##0.00", "en-US")
- 兼容旧版SSIS的表达式(无需依赖FORMAT函数):
- 将派生的字符串列映射到平面文件目标的对应外部列,设置外部列数据类型为
DT_WSTR,长度设为10(足够容纳5位精度+两位小数的格式) - 此方法可确保输出严格遵循
##0.00格式,彻底解决前置零缺失问题
方案三:设置平面文件列的格式属性
部分SSIS版本支持直接为DT_NUMERIC类型的外部列设置格式:
- 在平面文件连接管理器的「高级」选项卡中,选中目标列
- 在属性窗口中找到格式(Format)属性,设置为
0.00 - 保存设置后,平面文件目标会按指定格式输出数值,自动补全前置零
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

