(fast_executemany = True) Ошибка «[ODB C Драйвер 17 для SQL Сервер] Недопустимое значение символа для спецификации приведения (0) (SQLExecute) ')" - PullRequest
0 голосов
/ 14 апреля 2020

Я использую (executemany) функцию из pyodb c для заполнения данных в базе данных ms sql. Это мой код:

def populate_database(conn):
    tuples = [
        ('2020-04-13 00:50:42', 'AirShoppingRQ', 'ALEY', '2020-05-23', '', '', 'BRU-BLQ', ''),     
        ('2020-04-13 00:50:43', 'AirShoppingRQ', 'ALEY', '2021-01-23', '', '', 'LIS-STO', '')
    ]
    query_string = 'INSERT INTO mytable VALUES (?,?,?,?,?,?,?,?)'
    cursor = conn.cursor()
    #cursor.fast_executemany = True
    cursor.executemany(query_string, tuples)
    cursor.commit()

Работает нормально, но если я раскомментирую строку cursor.fast_executemany = True, я получу следующую ошибку:

('22018', '[22018] [Microsoft][ODBC Driver 17 for SQL Server]Invalid character value for cast specification (0) (SQLExecute)')

Ниже приведена моя таблица:

CREATE TABLE [dbo].[mytable](
  [field1] [datetime] NULL,
  [field2] [varchar](50) NULL,
  [field3] [varchar](20) NULL,
  [field4] [datetime] NULL,
  [field5] [datetime] NULL,
  [field6] [varchar](20) NULL,
  [field7] [varchar](40) NULL,
  [field8] [varchar](40) NULL
)

Что-то не так с форматами? Чего мне не хватает при использовании cursor.fast_executemany = True?

1 Ответ

0 голосов
/ 14 апреля 2020

При fast_executemany = False (по умолчанию) pyodb c отправляет один INSERT на строку и передает значения параметров напрямую через SQL Сервер. Когда SQL Сервер обнаруживает пустую строку в качестве значения параметра для столбца datetime, значение интерпретируется как 1900-01-01 00:00:00.

При fast_executemany = True pyodb c упаковывает все значения параметра в двоичная структура, называемая массивом параметров , которая передает ее вместе с текстом команды SQL, по существу выполняя вставку всех строк за один шаг. Однако драйвер SQL Server ODB C не делает того же предположения, что и T- SQL, относительно пустой строки для столбца datetime, поэтому вы получаете сообщение об ошибке.

TL; DR : Можно передать пустую строку в качестве значения параметра для столбца datetime, если вы используете fast_executemany = False, но не если вы используете fast_executemany = True.

...