Форматирование для pyodbc INSERT INTO SQL-сервер запросов - PullRequest
0 голосов
/ 07 ноября 2019

У меня были проблемы с 1 конкретным запросом за последнюю неделю. Я не могу найти что-либо в Интернете для этой конкретной ситуации (или, по крайней мере, я не ищу правильную вещь), но, безусловно, это то, что кто-то делал раньше. Я создаю новую таблицу в каждом цикле (с увеличивающимся столбцом идентификатора / ключа и 3 столбцами для моих данных), чтобы изменить имя таблицы, а затем добавить некоторые данные (все целые числа). Строка, вызывающая ошибку:

cursor.execute(''' INSERT INTO ? (column1, column2, column3) VALUES (?, ?, ?) ''' , tablename, rowData[0], rowData[1], rowData[2])

Ошибка, которую я получаю:

('42000', '[42000] [Microsoft] [ODBC SQL Server Driver] [SQL Server] Необходимо объявить табличную переменную "@ P1". (1087) (SQLExecDirectW); [42000] [Microsoft] [Драйвер ODBC SQL Server] [Оператор SQL Server] не удалосьбыть готовым. (8180) ')

Ранее я пытался использовать обычное форматирование строки Python со словарем '''INSERT INTO %(table)s VALUES %(list0)i, %(list1)i, %(list2)i ''' % {"table":tablename, "list0":list[0], "list1":list[1], "list2":list[2]}) и некоторыми вариациями двух форматов, но они также приводили к ошибкам.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 07 ноября 2019

Вы правы, полагая, что вам следует использовать параметризованный запрос, но параметры запроса можно использовать только для вставки столбцов значений , а не имен столбцов / таблиц. Поэтому вам нужно использовать сочетание динамического SQL и параметризации запросов:

sql = "INSERT INTO [%s] (column1, column2, column3) VALUES (?, ?, ?)" % tablename
cursor.execute(sql, rowData[0], rowData[1], rowData[2])
...