我有一个如下的SQL脚本:
DECLARE @AGE INT =?
,@ NFS VARCHAR(20)=?
INSERT INTO [dbo]。[new_table](年龄,名称)
SELECT @AGE,@ NIN
SELECT ID = CAST(SCOPE_IDENTITY()AS INT)
在表格中,IDENTITY column ID
定义为INT
。因此,ID
列的值随着插入新行而增加。 And my goal is to take out the
编号that just inserted.
上面的代码在SQL中运行良好。
然后我尝试在python中运行它,使用以下代码:
conn = pyodbc.connect("driver={SQL Server}; server= MyServer; database= MyDatabase"; trusted_connection=true")
cursor = conn .cursor()
SQL_command = """
DECLARE @AGE INT = ?
, @NAME VARCHAR(20) = ?
INSERT INTO [dbo].[new_table] (AGE, NAME)
SELECT @AGE, @NAME
SELECT ID = CAST(SCOPE_IDENTITY() AS INT)
"""
cursor.execute(SQL_command, 23, 'TOM')
result = cursor.fetchall()
但是,我收到了以下错误消息:
追踪(最近一次呼叫最后一次):
文件" C:\ Users \ wwang \ Documents \ Aptana Studio 3工作区\ ComparablesBuilder \ test.py",第119行,
result = cursor.fetchall()
pyodbc.ProgrammingError:没有结果。以前的SQL不是查询。
所以,我可以知道为什么相同的代码不能在python中工作吗?我对pyodbc的使用是不正确的?
非常感谢。
答案 0 :(得分:1)
您的Sql Batch中的多个语句可能被解释为与Python驱动程序不同的结果集 - 第一个行计数返回语句是INSERT
语句,这可能是罪魁祸首。
尝试在语句之前添加SET NOCOUNT ON;
,以禁止非查询的行计数:
SET NOCOUNT ON;
DECLARE @AGE INT = ?
, @NAME VARCHAR(20) = ?
...
SELECT ID = CAST(SCOPE_IDENTITY() AS INT);
修改
IIRC,一些驱动程序也依赖于Sql Server的ROW COUNT
来正确解析结果集。因此,如果上述操作失败,您也可以尝试:
SET NOCOUNT ON;
DECLARE ...;
INSERT ...;
SET NOCOUNT OFF; -- i.e. Turn back on again so the 1 row count can be returned.
SELECT CAST(SCOPE_IDENTITY() AS INT) AS ID;