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)
我是 运行 一个连接到 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)