如何使用SSIS派生列将带正负号的整数字符串转为浮点数?
问题根源
你遇到的转换错误主要是两个原因:
- 字符串截取位置错误——比如你用
Substring(FieldName,8,2),但源字符串+0012345总共才8位,从第8位开始取2位根本取不到有效内容,拼接出来的是+00123.这种非法格式,自然转不成浮点数。 - 未处理无效尾记录——尾记录空值直接参与转换,必然触发类型转换错误。
修正步骤
1. 修正字符串截取逻辑
先确认源字符串的有效长度:比如+0012345是8位(符号+7个数字),要拆成123.45,需把前6位(符号+前5个数字)和最后2位数字拼接,中间加小数点。用Substring的正确写法:
(DT_R8)(Substring(FieldName, 1, 6) + "." + Substring(FieldName, 7, 2))
如果源字符串是7位(符号+6个数字,比如+001234对应12.34),就调整截取长度:
(DT_R8)(Substring(FieldName, 1, 5) + "." + Substring(FieldName, 6, 2))
用Left/Right的写法也可行,前提是所有有效记录长度一致:
(DT_R8)(Left(FieldName, 6) + "." + Right(FieldName, 2))
2. 处理无效尾记录
两种方案任选:
- 派生列内直接处理空值:先判断字段是否为空或长度不符,是的话返回NULL,避免转换失败:
ISNULL(FieldName) || LEN(FieldName) != 8 ? NULL(DT_R8) : (DT_R8)(Substring(FieldName, 1, 6) + "." + Substring(FieldName, 7, 2))
注意把LEN(FieldName) != 8中的8替换为你实际的有效记录长度。
- 条件拆分分流:在数据流中添加「条件拆分」转换,将符合格式的记录(比如
LEN(FieldName) == 8 && FieldName != "")导入目标表,尾记录这类无效数据可写入错误日志或直接忽略。
3. 校验源数据格式
确保所有有效记录都是「符号+固定长度数字」的格式:符号仅为+或-且位于第一位,数字部分无空格、乱码,长度统一。
测试验证
拿+0012345测试修正后的表达式:Substring(FieldName,1,6)得到+00123,Substring(FieldName,7,2)得到45,拼接后为+00123.45,转换为DT_R8后得到123.45;负号记录-0012345转换后为-123.45,正负符号正常保留。
内容的提问来源于stack exchange,提问作者SidC
相关产品推荐
相关产品推荐

