PyODBC从一个简单的SELECT子句获取结果

时间:2014-12-16 11:49:03

标签: python sql sql-server pyodbc

我有一个如下的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的使用是不正确的?

非常感谢。

1 个答案:

答案 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;