从SAP同步数据至SQL触发Error 8114类型转换错误
解决SAP数据同步SQL Server时的类型转换错误(Error 8114)
问题根源
SQL错误8114本质是SQL Server无法将SAP传入的字符型数据转换为目标numeric/decimal类型——哪怕你修改了ABAP结构字段类型,只要源数据存在格式问题(比如空格、非法字符、小数点分隔符不匹配),或者字段映射错误,就会触发这个报错。
具体解决方案
1. 核对字段映射关系
对照SQL表的字段类型(从截图可见Stock、RetailCurrentPrice、Weight、ShippingCost、SKUId为数值类型),确保ABAP代码里的字段一一对应:
- 数值类型的SQL字段必须对应ABAP的数值类型(如
p、i、decfloat),或经过清洗的合法数字字符串; - 检查
WHERE条件里的SKUId,如果SQL侧是数值型,ABAP侧不能直接传带空格的CHAR字段。
2. 强制清洗SAP源数据
SAP的CHAR字段默认会补空格,且可能用逗号作为小数点分隔符,必须先预处理:
* 去除字段前后及中间空格 CONDENSE GS_SAP_TABLE2-STOCK NO-GAPS. CONDENSE GS_SAP_TABLE2-RETAILCURRPRICE NO-GAPS. CONDENSE GS_SAP_TABLE2-WEIGHT NO-GAPS. CONDENSE GS_SAP_TABLE2-SHIPPINGCOST NO-GAPS. CONDENSE GS_SAP_TABLE2-SKUID NO-GAPS. * 替换小数点分隔符(SAP用逗号,SQL Server用点) REPLACE ALL OCCURRENCES OF ',' IN GS_SAP_TABLE2-RETAILCURRPRICE WITH '.'. REPLACE ALL OCCURRENCES OF ',' IN GS_SAP_TABLE2-WEIGHT WITH '.'. REPLACE ALL OCCURRENCES OF ',' IN GS_SAP_TABLE2-SHIPPINGCOST WITH '.'.
3. 显式类型转换(ABAP侧优先)
把清洗后的字符串转成ABAP数值类型,再传入SQL,避免隐式转换出错:
DATA: lv_stock TYPE p DECIMALS 5, lv_retail_price TYPE p DECIMALS 5, lv_weight TYPE p DECIMALS 5, lv_shipping_cost TYPE p DECIMALS 5, lv_skuid TYPE i. * 安全转换(捕获非法数据) TRY. lv_stock = GS_SAP_TABLE2-STOCK. lv_retail_price = GS_SAP_TABLE2-RETAILCURRPRICE. lv_weight = GS_SAP_TABLE2-WEIGHT. lv_shipping_cost = GS_SAP_TABLE2-SHIPPINGCOST. lv_skuid = GS_SAP_TABLE2-SKUID. CATCH cx_sy_conversion_error. " 处理非法数据:跳过记录/写入错误日志 CONTINUE. ENDTRY.
4. 修改UPDATE语句使用转换后的数值变量
EXEC SQL. UPDATE STOCKKEEPINGUNITS SET ProductId = :GS_SAP_TABLE2-PRODUCTID, CreatedOn = :GS_SAP_TABLE2-CREATEDON, UpdatedOn = :GS_SAP_TABLE2-UPDATEDON, UPC = :GS_SAP_TABLE2-UPC, AvailabilityType = :GS_SAP_TABLE2-AVAILABILITYTYPE, Stock = :lv_stock, Currency = :GS_SAP_TABLE2-CURRENCY, TaxClass = :GS_SAP_TABLE2-TAXCLASS, RetailCurrentPrice = :lv_retail_price, Weight = :lv_weight, MeasurementUnitId = :GS_SAP_TABLE2-MEASUREMENTUID, NameL1 = :GS_SAP_TABLE2-NAMEL1, NameL2 = :GS_SAP_TABLE2-NAMEL2, ShippingCost = :lv_shipping_cost WHERE SKUId = :lv_skuid ENDEXEC.
5. 定位问题字段(调试技巧)
如果还是报错,把UPDATE语句拆成单个字段更新,逐个测试:比如先只更新Stock,成功后再加RetailCurrentPrice,以此类推,快速定位到具体是哪个字段的数据存在问题。
额外注意事项
- 检查日期字段
CreatedOn/UpdatedOn的格式:SQL Server需要YYYY-MM-DD或YYYY-MM-DD HH:MM:SS格式,若SAP侧是CHAR字段,需先转换为该格式; - 确保数值范围匹配:SQL侧的
decimal(18,5)不能接收超过精度的数值,ABAP侧转换时要注意溢出问题。
内容的提问来源于stack exchange,提问作者Dragonite LvL 100
相关产品推荐
相关产品推荐

