python - 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)')
谢谢。
解决方案
您没有?
用逗号分隔换行符之间的传递,例如:
'values(?,?,?,?,?,?' \
'?,?,?,?,?,?,?'\
不是当第一行和第二行连接时,它们会形成一个像这样的字符串:
values(?,?,?,?,?,??,?,?,?,?,?,?
# note ^^
因此,您需要确保?
在每一行的尾随后添加一个逗号,最后一行除外。
推荐阅读
- kubernetes - Kubernetes 在 values.yaml 中使用 {{ include xx }}
- reactjs - 复制到剪贴板特定项目
- assembly - 使用立即操作数编码 x86-16 指令
- google-kubernetes-engine - 入口规则不会在 Pod 之间平均分配流量,
- c++ - 检查向量的重复频率
- asp.net-mvc - ASP .NET MVC 无法将图像上传到 Blob 存储
- forms - IF 条件不适用于 Microsoft PowerApps 中的两个下拉菜单
- asp.net-core - 我在 Asp.net core web api 中得到这个响应代码 415
- github - 我如何忽略 .gitignore 中的 .swift 文件
- operating-system - 了解 IDTR 寄存器吗?