由于“参数 7 (””) 导致错误的“插入”语句:提供的值不是数据类型浮点数的有效实例。

Ron*_*yan 6 python sql-server

我正在使用 Python 一次一行地将一批 CSV 文件加载到 SQL Server 表中。每个文件都包含许多自由文本字段和错误数据,我在尝试插入之前对其进行了修剪和重命名。

一般来说(大约 95% 的时间),代码似乎可以工作,但会出现异常并显示下面描述的错误消息。

我很困惑 a) 我的表中只有四列,并且不明白为什么它会寻找参数 7,并且 b) 文本列被加载到 nvarchar(max) 格式的列中,所以我不会'不要期望数据类型错误。

我检查了源文件以查看哪些行引发了错误,问题行和其他成功加载的行之间似乎没有明显区别。

我已经将过程修剪回仅插入 JobID(作为 bigint)并且它可以正常工作,但是一旦我引入文本字段,它就会导致错误。

我正在使用 Python 3.7.0 并加载到 SQL Server 14.0

import numpy as np
import pyodbc
import os
import glob
import pandas as pd
import csv
import config
import urllib
import shutil
import codecs

path = "C:\\myFilePath"

allFiles = glob.glob(os.path.join(path, "*.csv"))

for file_ in allFiles:
    df = pd.concat((pd.read_csv(f, encoding='utf8') for f in allFiles))

cnxn = pyodbc.connect("Driver={ODBC Driver 13 for SQL Server};"                                             
                  "Server=myServer;"
                  "Database=myDatabase;"
                  "Trusted_Connection=yes;"
                  "SelectMethod=cursor;"
                  )

df2 = df[['JobID', 'NPS_score', 'Obtuse_Column_Name_1', 'Obtuse_Column_Name_2']].copy()

df2.columns = ['JobID', 'Score','Q1', 'Q2']

cursor = cnxn.cursor()
for index,row in df2.iterrows():
    try:
        counter = counter + 1
        cursor.execute("""insert into [myDB].[dbo].[input_test]( [JobID], [Score], [Q1], [Q2]) VALUES (?, ?, ?, ?)""", row['JobID'],row['Score'],row['Q1'], row['Q2'])
        cursor.commit()
        print(counter)
    except Exception as e:
        print(e) 
        continue    
cursor.close()  
cnxn.close()
Run Code Online (Sandbox Code Playgroud)

我希望加载数据,但在某些行中会收到以下错误代码:

('42000', '[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 7 (""):提供的值不是浮点数据类型的有效实例。检查源数据中是否存在无效值。无效值的一个示例是比例大于精度的数字类型数据。(8023) (SQLExecDirectW)')

Suh*_*ote 8

我在将数据转储到 SQL 表时遇到了类似的错误

我将数据导出到 .csv 文件,发现两列中有inf值。

所以,我用nan替换了inf值并且它起作用了:)

df2.replace([np.inf, -np.inf], np.nan, inplace = True)
df2 = df2.fillna(0)
Run Code Online (Sandbox Code Playgroud)

PS:这个答案也可能对其他人有帮助。


Ron*_*yan 7

我已经找到并解决了这个问题。按照@TomRon 的建议,我将插入语句打印到错误块中。这表明,尽管我假设 Q2 在我将其加载到数据框中时已填充(就像在 CSV 中一样),但由于某种原因它是 NaN。

我只是包含了用 0 替换 NaN 的函数,它现在在我创建要加载的数据帧(df2)后立即使用以下代码行成功加载所有行

df2 = df2.fillna(value=0)
Run Code Online (Sandbox Code Playgroud)