使用 Python 创建的 INSERT 语句在执行和提交时给了我一个错误。我已经从Python中获取了该语句的副本,并在SQL SERVER中自己运行它,它在那里工作正常。我尝试插入的表有一个标识列。当 Python 尝试执行时,当我排除语句中的标识列时,它会给我一个错误,说明下面是什么
表看起来像这样MY_TABLE( ID 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)")">
但是当我尝试包含 Identity 列的值时(我不想这样做),我收到以下错误,这是有道理的,因为它是一个我们让表自动递增的身份列
"当 IDENTITY_INSERT 设置为 OFF 时,无法在表'MY_TABLE'中插入标识列的显式值。">
当我在 SQL SERVER 中运行查询时,表会填充标识列本身的值并自动递增,但由于某种原因,当我在 Python 中运行语句时,它不会这样做并尝试传递 NULL
SQL 服务器版本: 10.50.6560.0
意识到有点晚了,但是...我最近在使用一些旧程序和 ODBC 时遇到了同样的问题。 解决方案是在 SQL Server 中创建一个仅包含所需列的视图(即在您的情况下为 A 和 B),然后插入到该视图中。
没有你的代码有点难以分辨,但这里有一个例子。
在数据库中创建测试表
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()