Python для SQL загрузки CSV-файлов с ошибкой «необходимо объявить скалярную переменную» - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь выполнить оператор SQL с помощью Python, возвращает ошибку.

Я в основном пытаюсь вставить несколько записей CSV из папки в SQL.Я хотел бы вставлять записи CSV строка за строкой в ​​SQL без создания фрейма данных.Я сделал переменную, которая имеет строку, которая содержит заявление SQL.Я использую эту переменную в функции execute.вот так - 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)')

Спасибо.

1 Ответ

0 голосов
/ 10 апреля 2019

Вы не отделяете ? между символами новой строки через запятую, например ::1002*

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

Не тогда, когда первая и вторая строки объединяются, они образуют строку, подобную следующей:

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

Поэтому вам нужно обязательно добавлять запятую после завершающего ? в каждой строке, кроме последней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...