MSSQL2014 & python 3.7.3:尝试获取存储过程 return 值导致 "No results. Previous SQL was not a query."

MSSQL2014 & python 3.7.3: Trying to get stored procedure return value results in "No results. Previous SQL was not a query."

我是 运行 一个连接到 MSSQL 数据库的 python 脚本,运行一个存储过程并且应该根据存储过程 return 值采取一些行动。这是代码:

'''
sql = """\
        SET NOCOUNT ON
        DECLARE @rv INT
        EXEC @rv = [MY_DB].[dbo].[sp_Load_Actuals]
        SELECT @rv 
        """
...
conn = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};'
                                      'Server=MY_SERVER;'
                                      'Database=MY_DB;'
                                      'Trusted_Connection=yes;')

conn.autocommit = True
cursor = conn.cursor()
cursor.execute(sql)
retv = cursor.fetchone() 
...

在执行最后一条语句时,我捕获了 pyodbc.DatabaseError 异常消息 "No results. Previous SQL was not a query." 我已经在这里阅读了所有相关文章,但显然我仍然做错了。

我错过了什么?

您必须调用 cursor.nextset() 以跳过被调用存储过程输出的任何信息消息,因为此处 NOCOUNT ON 是不够的。

但不幸的是 cursor 没有 .hasrows() 方法,所以你必须在循环中捕获异常。

EG:

import pyodbc


sql = """\
        SET NOCOUNT ON
        DECLARE @rv INT
        EXEC @rv = sp_executesql N'print ''informational message'''
        SELECT @rv 
        """

conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                                      'Server=localhost;'
                                      'Database=tempdb;'
                                      'Trusted_Connection=yes;')

conn.autocommit = True
cursor = conn.cursor()
cursor.execute(sql)

while True:
    try:
        retv = cursor.fetchone() 
        break
    except pyodbc.ProgrammingError as e:
       if "Previous SQL was not a query." in str(e):
        if not cursor.nextset():
          throw

print(retv)