数据工厂迁移MSSQL至PostgreSQL时decimal/numeric字段转换报错
Azure数据工厂迁移MSSQL至PostgreSQL时decimal/numeric字段22P02报错解决方案
问题根因
PostgreSQL的numeric/decimal类型默认要求使用英文半角句点.作为小数点分隔符,报错中传入的字符串"0,833"是使用半角逗号作为小数点的本地化数值格式,不符合PG的数值语法解析规则,因此触发Npgsql驱动抛出22P02类输入语法错误。
这类问题通常来自三个环节的配置偏差:
- MSSQL源端按区域本地化规则输出带逗号分隔的数值字符串
- ADF流转过程未做格式清洗直接透传非标准格式数值
- 目标端Npgsql驱动按服务器本地区域规则解析数值,与PG的解析规则不匹配
可落地修复方案
1. 从MSSQL源端根治格式问题
- 调整MSSQL源的数据库区域配置为
en-US,强制所有decimal/numeric类型输出时使用半角句点作为小数点分隔符,从源头避免生成带逗号的本地化数值字符串。 - 如果源端无法修改数据库区域设置,在ADF复制活动/映射数据流的源端预处理环节对decimal字段做精准格式处理:对纯小数值格式(如
0,833)将逗号替换为半角句点;对带千分位的格式(如1,234,56)先删除千分位逗号再替换小数点,避免一刀切替换导致数值错乱。
2. 优化ADF数据映射的类型转换逻辑
- 不要将源端输出的字符串格式数值直接映射到PG的numeric/decimal字段,在映射环节对清洗完成的数值做显式类型转换,确认转换后的值使用半角句点作为小数点后再写入目标表。
- 检查集成运行时的系统区域设置:如果使用自托管集成运行时,需将运行时所在服务器的系统区域小数点分隔符调整为半角句点,避免Npgsql驱动按本地规则解析数值时出现格式不匹配。
3. 目标端兜底校验
- 在PG目标表写入前增加临时校验环节,筛选出所有带逗号的字符串数值,单独走清洗逻辑后再写入主表,避免单条脏数据导致整批迁移流程失败。
典型报错详情:
Type=Npgsql.PostgresException,Message=22P02: invalid input syntax for type numeric: "0,833",Source=Npgsql
内容的提问来源于stack exchange,提问作者Ozgur SARIOGLAN
相关产品推荐
相关产品推荐

