首页 > 解决方案 > python到SQL加载csv文件给出错误“必须声明标量变量”

问题描述

我正在尝试使用 python 执行 sql 语句,返回错误。

我基本上是在尝试从 sql 中的文件夹中插入多个 csv 记录。我想在 sql 中逐行插入 csv 记录而不制作数据框。我创建了一个变量,该变量具有一个包含 sql 语句的字符串。我在执行函数中使用该变量。像这样 - cur1.execute(sql_query, row)

import os
import csv
import pyodbc
import time

conn1 = pyodbc.connect(r'Driver={SQL Server};'
                       r'Server=Servername;'
                       r'Database=Testing;'
                       r'Trusted_Connection=yes;')

cur1 = conn1.cursor()

start = time.time()
sql_query ='INSERT INTO testing01( EmployeeID'\
           ',EmployeeName'\
           ',ProjectID'\
           ',WBSElement'\
           ',StartDate'\
           ',EndDate'\
           ',AbsenceAttendanceHours'\
           ',AllocationPercent'\
           ',CRMID'\
           ',PCMTID'\
           ',ProjectPracticeID' \
           ',ProjectSBU' \
           ',SBUAbbrivation' \
           ',ProjSBUName' \
           ',ProjectPractice'\
           ',EmployeeSBU' \
           ',EmployeePractice' \
           ',EmployeeSubPractice' \
           ',ProjectProfile' \
           ',ProjectReason' \
           ',BillType' \
           ',SubBillType'\
           ',CustomerName'\
           ',ProjectManagerID'\
           ',ProjectManager'\
           ',DeliveryManagerID' \
           ',DeliveryManager' \
           ',SupervisorID' \
           ',Supervisor'\
           ',RoleSite'\
           ',RoleID' \
           ',C' \
           ',ActivityType' \
           ',RoleStatus' \
           ',CountryName' \
           ',EmployeeGrade' \
           ',JoiningDate' \
           ',ResourceGroup'\
           ',PersonnelArea' \
           ',PersonnelSubArea' \
           ',CustomerSite' \
           ',LastWorkingDayDate' \
           ',NameofEEsubgroup'\
           ',RoleName'\
           ',StreamName'\
           ',SkillName'\
           ',SkillGroup'\
           ',PrimarySkill'\
           ',Billability'\
           ',AmtInLocCur'\
           ',Currency'\
           ',RoleFTE'\
           ',OffshoreAmount'\
           ',OnsiteAmount'\
           ',EmployeeStatus'\
           ',BusinessLead'\
           ',BusinessLeadName)' 'values(?,?,?,?,?,?' \
           '?,?,?,?,?,?,?'\
           '?,?,?,?,?,?' \
           '?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?,?,?' \
           '?,?,?,?)'

for files in os.listdir("C://Users/XXX/Desktop/ABC/ZCP/"):
    print(files)
    with open("C://Users/XXX/Desktop/ABC/ZCP/" + files, "r") as file:
        readercsv = csv.reader(file)
        next(readercsv)
        for row in readercsv:
            cur1.execute(sql_query, row)

            conn1.commit()
print("success attrition")


end = time.time()
print(end - start)

我想知道必要的更改才能使其正常工作。我得到的错误是:

cur1.execute(sql_query, row)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the scalar variable "@P6@P7". (137) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)')

谢谢。

标签: pythonsqlsql-serverpython-3.x

解决方案


您没有?用逗号分隔换行符之间的传递,例如:

'values(?,?,?,?,?,?' \ 
       '?,?,?,?,?,?,?'\

不是当第一行和第二行连接时,它们会形成一个像这样的字符串:

 values(?,?,?,?,?,??,?,?,?,?,?,?
# note            ^^

因此,您需要确保?在每一行的尾随后添加一个逗号,最后一行除外。


推荐阅读