如何在SSIS中使用派生列转换将字符串转为指定小数格式?
SSIS派生列转换实现COLB字段保留两位小数格式
问题场景
原始数据文件格式如下:
COLA,COLB,COLC James,198.87,09 Jack,32.7,78 Philips,0.0,98 Jacob,0,76
需求是通过SSIS派生列转换,将COLB字段处理为固定保留两位小数的格式,预期结果为:198.87、32.70、0.00、0.00。
尝试过的错误方案
使用以下表达式时出现解析错误:
LEN(TRIM([COLB])) == 0 ?" " : (iSNULL( (DT_DECIMAL,18,2) [COLB]) ? " " : (DT_WSTR,10) (DT_DECIMAL,18,2)[COLB])
错误提示:
Error at Data Flow Task [Derived Column [96]]: Cannot parse the expression "
LEN(TRIM([COLB])) == 0 ?" " : (iSNULL( (DT_DECIMAL,18,2) [COLB]) ? " " : (DT_WSTR,10) (DT_DECIMAL,18,2)[COLB])". The expression was not valid, or there is an out-of-memory error.
ROUND函数的问题
使用ROUND函数的表达式:
(DT_WSTR,20)(ROUND((DT_R8)[Rate Paid],2))
得到的结果不符合预期,多余的小数位未被截断:
COLA,COLB,COLC James,198.86666,09 Jack,32.700000,78 Philips,0.0000,98 Jacob,0,76
正确解决方案
方案1:使用STR函数(兼容所有SSIS版本)
STR函数可直接将数值格式化为指定小数位数的字符串,结合TRIM去除前导空格,同时处理空值场景:
ISNULL([COLB]) ? "0.00" : TRIM(STR((DT_DECIMAL,2)[COLB], 10, 2))
- 先将COLB强制转换为
DT_DECIMAL,2类型,确保两位小数精度 - 用STR格式化为两位小数的字符串,TRIM去掉默认的前导空格
- 空值时返回"0.00",保证输出格式统一
方案2:使用FORMAT函数(SSIS 2012及以上版本)
FORMAT函数支持灵活的格式字符串,指定"N2"即可生成带两位小数的数值字符串:
ISNULL([COLB]) ? "0.00" : FORMAT([COLB], "N2")
- "N2"表示数值格式,自动保留两位小数并补零
- 同样处理空值场景,输出符合预期的格式
错误原因说明
- 原表达式中
(DT_DECIMAL,18,2)语法错误:SSIS中DT_DECIMAL类型仅需指定小数位数(scale),正确写法为(DT_DECIMAL,2) iSNULL拼写错误,应为ISNULL- ROUND函数仅对数值进行四舍五入,不会改变其字符串输出的精度,因此仍会显示多余小数位,需通过字符串格式化函数实现固定位数输出
内容的提问来源于stack exchange,提问作者AMDI
相关产品推荐
相关产品推荐

