Неудачное преобразование SQL из smalldatetime в float

Я использую pypyodbc для вставки новой записи в таблицу MS SQL Server с параметризованным запросом ниже.

Я включил структуру таблицы ниже. Для запроса на выполнение я добавил встроенные комментарии значений отладки во время выполнения.

    sql_statement = """
      INSERT INTO [hr].[VMS.Requisitions] 
        (VMSRequisitionID,         
         JobTitle,                 
         HiringManagerEEID,        
         GroupID,                  
         DepartmentID,             
         LocationID,               
         MinRate,                  
         MaxRate,                  
         LaborTypeID,              
         RequisitionStatusID,      
         Openings,                 
         OpeningsRemaining,        
         RequisitionCreateDate,    
         RequisitionApproveDate,   
         RequisitionOpenDate,      
         RequisitionCloseDate,     
         CreateDate,               
         ModifyDate)               
      VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""

    cursor.execute(sql_statement,(requisition.VMSRequisitionID,     # {unicode} 'xxx'
                     requisition.JobTitle,               # {unicode} 'xxx'
                     requisition.HiringManagerEEID,      # {int} 3
                     requisition.GroupID,                # {int} 36
                     requisition.DepartmentID,           # {int} 189
                     requisition.LocationID,             # {int} 44
                     requisition.MinRate,                # {float} 33.5
                     requisition.MaxRate,                # {float} 50.24
                     requisition.LaborTypeID,            # {int} 5
                     requisition.RequisitionStatusID,    # {int} 9
                     requisition.Openings,               # {int} 11
                     requisition.OpeningsRemaining,      # {int} 11
                     requisition.RequisitionCreateDate,  # {datetime} 2017-07-10 11:41:36
                     requisition.RequisitionApproveDate, # {NoneType} None
                     requisition.RequisitionOpenDate,    # {NoneType} None 
                     requisition.RequisitionCloseDate,   # {NoneType} None
                     now,  # {str} '2017-10-04T12:37:14'
                     now,  # {str} '2017-10-04T12:37:14'
                     ))
    cursor.commit()

Я получаю следующую ошибку:

ProgrammingError: (u'42000', u'[42000] [Microsoft] [драйвер ODBC SQL Server] [SQL Server] Неявное преобразование из типа данных smalldatetime в float не допускается. Используйте функцию CONVERT для запуска этого запроса.')

Я отлаживал это часами и не понимаю, что происходит не так. Я считаю, что проблема возникла, когда я добавил в таблицу столбцы MinRate и MaxRate, поэтому предположим, что существует проблема с неправильным преобразованием чисел с плавающей запятой с использованием параметризованного запроса.

Структура таблицы следующая:

RequisitionID            int           Primary Key, Identity Column / Auto-increment
VMSRequisitionID         varchar(255)  Required
JobTitle                 varchar(255)  Required
HiringManagerEEID        int           NULLs allowed
GroupID                  int           NULLs allowed
DepartmentID             int           NULLs allowed
LocationID               int           NULLs allowed
MinRate                  float         NULLs allowed
MaxRate                  float         NULLs allowed
LaborTypeID              int           NULLs allowed
RequisitionStatusID      int           NULLs allowed
Openings                 int           NULLs allowed
OpeningsRemaining        int           NULLs allowed 
RequisitionCreateDate    datetime      NULLs allowed
RequisitionApproveDate   datetime      NULLs allowed 
RequisitionOpenDate      datetime      NULLs allowed  
RequisitionCloseDate     datetime      NULLs allowed
CreateDate               datetime      Required
ModifyDate               datetime      Required

Есть предположения? Я использую Python 2.7 и pypyodbc 1.3.3.


person user1944673    schedule 04.10.2017    source источник
comment
Пожалуйста, можете ли вы показать структуру вашей таблицы? exec sp_columns yourTable;   -  person Loïc    schedule 05.10.2017
comment
@Loïc Я не смог выполнить ваш запрос в своей среде, но отредактировал приведенное выше описание проблемы со структурой таблицы. Спасибо, что посмотрели!   -  person user1944673    schedule 05.10.2017
comment
это странно, ваш запрос выглядит нормально с моей точки зрения. Вы уверены, что это единственный запрос, вызывающий сбой? Не могли бы вы распечатать SQL, сгенерированный для вставки?   -  person Loïc    schedule 05.10.2017
comment
Хммм, я не могу получить запрос через отладку, но уверен, что что-то не так со значениями с плавающей запятой. Я предполагаю, что SQL Server по какой-то причине интерпретирует значения как shortdatetime вместо float.   -  person user1944673    schedule 05.10.2017
comment
Вы можете выделить поле ..   -  person maSTAShuFu    schedule 05.10.2017
comment
Можете ли вы отредактировать свой вопрос с помощью версий Python и pypyodbc, которые вы используете? Я не могу воспроизвести вашу проблему, используя тестовый код здесь.   -  person Gord Thompson    schedule 05.10.2017
comment
можете ли вы проверить это: stackoverflow.com/questions/5266430/ Я думаю, что возможность увидеть реальную вставку sql многим поможет. Есть и другие способы: stackoverflow.com/questions/13638435/   -  person Loïc    schedule 05.10.2017
comment
К сожалению, похоже, что захват фактического запроса с помощью pyodbc невозможен: « title = «как получить подготовленный запрос, который отправляется в базу данных»> stackoverflow.com/questions/17591459/. У меня также нет прав доступа для выполнения запроса по вашей второй ссылке, @Loïc.   -  person user1944673    schedule 05.10.2017
comment
@GordThompson Я обновил вопрос, указав свои версии Python и pypyodbc. Спасибо за помощь в устранении неполадок ... Я все еще не понимаю, что здесь происходит.   -  person user1944673    schedule 05.10.2017
comment
возможно, вам следует использовать десятичное число вместо числа с плавающей точкой с python для MinRate/MaxRate   -  person Loïc    schedule 05.10.2017
comment
Также не удалось воспроизвести проблему с Python 2.7.13 и pypyodbc 1.3.5 (PyCharm не установил 1.3.3). Мой тестовый код находится здесь. Можете ли вы воспроизвести с помощью pypyodbc 1.3.5?   -  person Gord Thompson    schedule 05.10.2017
comment
Я обновил свой pypyodbc до 1.3.5 и все еще вижу ошибку. Я также изменил тип данных на Decimal, что привело к тому же сообщению об ошибке с заменой float на decimal.   -  person user1944673    schedule 06.10.2017
comment
Это наводит меня на мысль, что значения 33,5 и 50,24 в приведенном выше примере интерпретируются как smalldatetime, а не с плавающей запятой/десятичные числа.   -  person user1944673    schedule 06.10.2017
comment
Можете ли вы перепроверить, что type(requisition.MinRate) возвращает <type 'float'> ...?   -  person Gord Thompson    schedule 06.10.2017
comment
Да, я подтвердил, что это тип float.   -  person user1944673    schedule 07.10.2017
comment
На данный момент я реализовал обходной путь, так как мне до сих пор не удалось решить проблему. Спасибо всем за помощь!   -  person user1944673    schedule 07.10.2017