Pandas数据插入SQL Server时CallLength字段类型转换报错排查
解决SQL Server插入时CallLength字段类型转换报错的问题
排查隐性异常数据
先确认数据中是否存在容易忽略的异常值,比如无穷大(inf)、超出decimal(18,2)存储范围的数值:
import numpy as np # 查看CallLength的统计信息,确认数值范围 print(df_selected['CallLength'].describe()) # 检查是否存在inf、-inf或NaN值 invalid_rows = df_selected[df_selected['CallLength'].isin([np.inf, -np.inf, np.nan])] print(invalid_rows)
如果发现异常值,先清理(替换为合理值或删除对应行)后再尝试插入。
转换为Decimal类型匹配SQL字段
SQL Server的decimal(18,2)与Python的float存在精度映射差异,直接传递float可能触发转换错误。建议将字段转为Python标准库的Decimal类型,完全匹配SQL的decimal类型:
from decimal import Decimal # 保留两位小数后转为Decimal df_selected['CallLength'] = df_selected['CallLength'].round(2).apply(lambda x: Decimal(str(x)))
此方式能确保数值类型与SQL字段完全兼容,避免类型转换冲突。
改用批量插入替代逐行插入
手动逐行绑定参数易出现类型或顺序问题,推荐使用Pandas的to_sql方法批量插入,它会自动处理类型映射:
# 确保conn是有效的SQL Server连接(如pyodbc创建的连接) df_selected.to_sql( name='Test', con=conn, schema='marketing', if_exists='append', # 表已存在时追加数据 index=False, method='multi' # 启用批量插入,提升效率 )
这种方式既避免手动参数绑定的错误,也能大幅提升插入速度。
核对参数绑定顺序(可选)
再次确认INSERT语句的字段顺序与参数传递顺序完全一致:
你的INSERT字段顺序:FromName, FromNumber, ToName, ToNumber, Result, CallLength, CallStartTime, CallDirection
参数传递顺序:row['FromName'], row['FromNumber'], row['ToName'], row['ToNumber'], row['Result'], row['CallLength'], row['CallStartTime'], row['CallDirection']
若之前调整过df_selected的字段结构,需再次核对避免参数错位。
内容的提问来源于stack exchange,提问作者LunaLoveDove
相关产品推荐
相关产品推荐

