pyodbc вызывает хранимую процедуру с именем параметра; проблема с типом данных

#python #pyodbc

#python #pyodbc

Вопрос:

При запуске cursor_insert.execute (sql, параметры) я продолжаю получать сообщение «[ОШИБКА SQL] Ошибка преобразования типа данных nvarchar в float», хотя в моей исходной и целевой таблице db данные определены как float, nvarchar и nvarchar вместе с моей хранимой процедурой.

Установка моих параметров в новую переменную с именем ‘params’ вызывает это изменение в типе данных? Если да, то как я могу это обойти? (При чтении некоторой документации по Python тип данных не должен был изменяться, правильно?)

 # Create cursor associated with connection
cursor=conn.cursor()
cursor_select = conn.cursor()
cursor_insert = conn.cursor()

if conn:
    print('***** Connected to DCPWDBS289 *****')

select_str="SELECT TOP 5 Incident_ID,Incident_Type,Priority FROM 
incidents_all WHERE incidents_all.Status NOT IN ('Closed','Resolved')"

cursor_select.execute(select_str)

while True:

    row = cursor_select.fetchone()
    if not row:
        break
    print(' Row:     ', row)

    IncIncident_ID      = row[0]    # Float
    IncIncident_Type    = row[1]    # Str
    IncPriority         = row[2]    # Str

    sql = """EXEC ITSM.dbo.ITSM_LOAD @IncIncident_ID=?, 
    @IncIncident_Type=?,@IncPriority=?"""

    params = ('IncIncident_ID','IncIncident_Type','IncPriority')

    cursor_insert.execute(sql,params)

del cursor_insert
cursor.commit()
conn.close()
  

Ответ №1:

Вы не передаете parameter значения, вместо этого вы передаете строковый литерал, попробуйте это:

 # Create cursor associated with connection
cursor=conn.cursor()
cursor_select = conn.cursor()
cursor_insert = conn.cursor()

if conn:
    print('***** Connected to DCPWDBS289 *****')

select_str="SELECT TOP 5 Incident_ID,Incident_Type,Priority FROM 
incidents_all WHERE incidents_all.Status NOT IN ('Closed','Resolved')"

cursor_select.execute(select_str)

while True:

    row = cursor_select.fetchone()
    if not row:
        break
    print(' Row:     ', row)

    IncIncident_ID      = row[0]    # Float
    IncIncident_Type    = row[1]    # Str
    IncPriority         = row[2]    # Str

    sql = """EXEC ITSM.dbo.ITSM_LOAD @IncIncident_ID=?, 
    @IncIncident_Type=?,@IncPriority=?"""

    params = (IncIncident_ID, IncIncident_Type, IncPriority)

    cursor_insert.execute(sql,params)

del cursor_insert
cursor.commit()
conn.close()
  

Комментарии:

1. Я понял, что после того, как я выполнил некоторое устранение неполадок и сделал выбор, мои столбцы были заполнены именем переменной, LOL. Я реализовал ваше предложение. Это сработало, спасибо. Единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что что-то в моем цикле неверно, оно помещает каждую из 5 строк в новую таблицу более 3 миллионов раз в каждой строке. Вероятно, мне следует запустить новый поток, но вы видите что-нибудь вопиющее?

2. Спасибо. Я обнаружил проблему с бесконечным циклом, это была проблема с моей хранимой процедурой.