如何阻止ADF格式化SQL表负数字符串值及处理特殊值转Money?
解决ADF复制数据时的CSV格式转换问题
一、阻止CSV中-100被转为SQL的(100)
你的CSV列用了Excel会计数字格式,负数会显示成(100),ADF读取时直接把括号当成字符串内容,得先做格式清洗:
方法1:用数据流动预处理(推荐)
- 新建数据流动,源选你的CSV文件,在源设置里把目标列的数据类型强制设为String,避免ADF自动推断数字类型搞乱格式。
- 添加「派生列」转换,针对该列写替换表达式:
这个表达式会把replace(replace(目标列名, '(', '-'), ')', '')(100)直接转成-100,完美还原负号。
方法2:直接在复制活动里改映射
如果不想用数据流动,就在复制数据活动的「映射」选项卡,给目标列加表达式:
@replace(replace(item().sourceValue, '(', '-'), ')', '')
同时要确保CSV数据集的Schema里,该列类型设为String,禁止自动推断。
二、把CSV中的“-”转成SQL money类型的0
在上面的表达式基础上,加个判断逻辑处理单独的“-”:
数据流动里的派生列表达式
iif(目标列名 == '-', '0', replace(replace(目标列名, '(', '-'), ')', ''))
复制活动映射里的表达式
@iif(item().sourceValue == '-', '0', replace(replace(item().sourceValue, '(', '-'), ')', ''))
处理完后,把这个清洗后的字符串列直接映射到SQL的money类型列就行,ADF会自动把0、-100这类字符串转成对应的money值。
验证步骤
- 先跑数据流动预览,确认值是否正确:
-→0,(100)→-100,100→100。 - 再执行复制活动,检查SQL表的money列数据是否符合预期。
内容的提问来源于stack exchange,提问作者SQL_Noob
相关产品推荐
相关产品推荐

