#sql #sql-server #python-3.x #pyodbc
#sql #sql-server #python-3.x #pyodbc
Вопрос:
Инструкция INSERT, созданная с помощью Python, выдает ошибку при ее выполнении и фиксации. Я взял копию инструкции из Python и запустил ее сам в SQL SERVER, и там она отлично работает. Таблица, в которую я пытаюсь вставить, имеет столбец идентификатора. Когда Python попытается выполнить, это выдаст мне сообщение об ошибке, приведенное ниже, когда я исключаю столбец identity в инструкции
Таблица выглядит следующим образом MY_TABLE (идентификатор INT IDENTITY (1,1) НЕ равен НУЛЮ, A INT, B INT)
INSERT INTO MY_TABLE (A, B) VALUES(VALUE_A, VALUE_B);
«(‘23000’, «[23000] [ Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Не может вставить значение NULL в столбец ‘MY_IDENTITY_COLUMN’, таблица ‘MY_TABLE’; столбец не допускает нулевых значений. ОШИБКА ВСТАВКИ. (515) (SQLExecDirectW); [23000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Инструкция была завершена. (3621)»)»
Но когда я пытаюсь включить значение для столбца идентификатора (я не хочу этого делать) Я получаю следующую ошибку, которая имеет смысл, поскольку это столбец идентификатора, который мы разрешаем автоматически увеличивать в таблице
«Не удается вставить явное значение для столбца идентификатора в таблице ‘MY_TABLE’, когда для IDENTITY_INSERT установлено значение OFF».
Когда я запускаю запрос в SQL SERVER, таблица заполняет значение для самого столбца Identity и автоматически увеличивается, но по какой-то причине, когда я запускаю инструкцию в Python, она этого не делает и пытается передать NULL
Версия SQL SERVER: 10.50.6560.0
Комментарии:
1. Вы пытаетесь вставить значение в
IDENTITY
столбец, чего не следует делать, если вы не установилиIDENTITY_INSERT OFF
.2. правильно, но, как я уже говорил выше, когда я не передаю значения для этого столбца, я получаю первую ошибку также, когда я не указываю значения, я имею в виду, как это ВСТАВИТЬ В MY_TABLE (IDENTITY_COLUMN, A, B, ) ЗНАЧЕНИЯ (VALUE_A, VALUE_B)
3. Исключите столбец, таким образом, все будет работать просто отлично.
4. Первая ошибка возникает, когда я исключаю столбец
5. @Ilyes это должно быть принятым решением. В противном случае вам нужно было бы добавить оператор identity off в верхней части sql и снова включить его в конце блоков инструкций.
Ответ №1:
Признавая, что это немного поздно, но… Недавно у меня была такая же проблема с использованием какой-то старой программы и ODBC. Решение состояло в том, чтобы создать представление в SQL Server только с требуемыми столбцами (т. Е. A и B в вашем случае), а затем вставить в это представление.
Ответ №2:
Немного сложно сказать без вашего кода, но вот пример.
В базе данных создайте тестовую таблицу
CREATE TABLE dbo.test(
ID INT IDENTITY NOT NULL PRIMARY KEY,
Name VARCHAR(40) NOT NULL
);
Затем в Python укажите столбцы, в которые вы вставляете
import pyodbc
warecn = pyodbc.connect("Your Connection Stuff")
Inscursor = warecn.cursor()
Inscursor.execute("Insert into dbo.test(name) values ('This'), ('is'), ('a'), ('test')")
Inscursor.commit()
Inscursor.close()
del Inscursor
warecn.close()
Комментарии:
1. Это то, что я делаю, но Python, похоже, пытается передать NULL для столбца ID, хотя, как и в вашем операторе insert, я не пытаюсь вставить в этот столбец
2. Используете ли вы INSERT INTO MY_TABLE (A, B) ЗНАЧЕНИЯ (VALUE_A, VALUE_B);? Без указанного IDENTITY_COLUMN?
3. Хххмм. Не могли бы вы отредактировать свой вопрос, чтобы включить код, который передает значения в VALUE_A и VALUE_B?
4. Извините, я имел в виду цикл или функцию в вашем коде python, которая передает значения для VALUE_A и VALUE_B. Если вы закомментируете инструкцию insert и используете print(‘значение A равно {}, а значение B равно {}’.format(VALUE_A,VALUE_B)) Что печатается?
5. о, извините, не понял вопроса, поэтому я сделал это и запустил результат в SQL SERVER, и он работает без проблем, но при выполнении python выдает первую ошибку