You need to enable JavaScript to run this app. 数据工厂迁移MSSQL至PostgreSQL时decimal/numeric字段转换报错
优惠活动
大模型
产品
解决方案
定价
更多

数据工厂迁移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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 00:36:04