python 批量写入数据进sql server时,报错Error converting data type nvarchar to numeric.

问题如下:
我在使用python 批量插入csv文件数据进入sql server时遇到这个问题

(pymssql.OperationalError) 8114, b'Error converting data type nvarchar to  numeric.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n

经过百度了解到是写入的数据类型和数据库的不匹配,但是我不知道该怎么处理这个问题。有老哥帮忙改改写一下麽?
python代码如下

import pymssql
import pandas as pd

class MSSQL():
    def __init__(self):
        super(MSSQL, self).__init__()
        self.connection = pymssql.connect(host='*******',
                                          user='*******',
                                          password='*******.',
                                          database='*******',
                                          charset='utf8',
                                          autocommit=True)

    def insert(self, sql_command):
        conn = self.connection
        cursor = conn.cursor()

        cursor.execute(sql_command)
        cursor.close()
        conn.close()


def int_business():
    # 读取csv,并写入数据库
    excel_sheet_0 = pd.read_csv(r'd:\werwer.csv')
    field = '日期,订单编号,下单时间,接单时长,店铺名称,店铺ID,店铺所在城市,订单支付类型,订单状态,订单配送状态,是否预订单,' \
            '订单总金额,订单折扣后金额,平台承担活动金额,商家承担活动金额,商品分类,商品名称,UPC码,商品SKU码,' \
            '商品销售数量,商品原价销售额,商品实付销售额,商品总补贴金额,商品商家补贴金额,商品平台补贴金额,是否部分退款商品,' \
            '部分退款商品数量,部分退款商品金额,订单小额付款,配送费,是否活动订单,优惠活动,是否催单,回复状态,商家回复内容,' \
            '配送时长,打包袋费,订单完成时间,[订单取消原因(仅取消订单)],归属账号'
    sheet_data_np = excel_sheet_0.values
    for i in range(0, sheet_data_np.shape[0] + 1, 1000):
        sheet_data = sheet_data_np[i:i + 1000, :]
        data_str = "'),('".join("','".join(str(j) for j in i.tolist()) for i in sheet_data)
        insert_value = f"('{data_str}')".replace("'nan'", "''")
        insert_sql = f'begin transaction;insert into meituan_storeorder ({field}) values {insert_value};commit transaction;'
        MSSQL().insert(insert_sql)


int_business()

应该是excel某些数值列的数据有一些非数值数据导致的。你这里只对全局进行了nan替换,
建议你在拼接sql前对sheet_data的所有数值列进行一次数据清洗,将异常值填充为默认值。

数据库类型不匹配?
那你pd.read_csv(r'd:\werwer.csv')读取的时候设置一些字符集呢

感觉是'nan'替换以后出现的问题,nan对应的字段都是字符串类型吗?还是包括了整型或者浮点型呢?对照一下数据库里面的字段看一下,如果是整型或者浮点型,应该替换成0吧。另外,是执行i等于多少的时候报的错。

可以使用下面的方法, 使用ISNUMBERIC结合正则判断

SELECT
CASE WHEN ISNUMERIC(qtyStr)=1 AND qtyStrNOT not LIKE '%[^0-9.]%'
THEN CAST(qtyStr AS DECIMAL(19,6))
ELSE 0.0 END AS Qty
FROM #orders