用python调用远程sqlserver服务器上的存储过程,代码片断:
conn = pyodbc.connect(SERVER=host, UID=user, PWD=password, DATABASE=dbname,
DRIVER=driver)
cur = conn.cursor()
if not cur:
raise (NameError, '连接数据库失败')
else:
cur.execute("EXEC GetLastData")
resList = list()
resList = cur.fetchall()
执行时报错:
pyodbc.ProgrammingError: No results. Previous SQL was not a query.
经检查,存储过程在sqlserver环境下是可以正常执行的,看来是pyodbc调用时出了问题,在stackoverflow上找到一个类似的问题,答案如下:
The problem was solved by adding SET NOCOUNT ON; to the beginning of the anonymous code block. That statement suppresses the record count values generated by DML statements like UPDATE … and allows the result set to be retrieved directly.
机器译文:
通过添加到匿名代码块的开头,问题解决了。该语句抑制 DML 语句生成的记录计数值,并允许直接检索所设置的结果。SET NOCOUNT ON;UPDATE …
于是在存储过程中加上一句 SET NOCOUNT ON
CREATE proc [dbo].[GetLastData]
AS
BEGIN
SET NOCOUNT ON
declare @begindate datetime,@enddate datetime
select @begindate=CONVERT(varchar(7),GETDATE(),120)+'-01'
select @enddate=DATEADD(MONTH,1,@begindate)
问题解决。
参考网址:https://stackoverflow.com/questions/48061304/pyodbc-programmingerror-no-results-previous-sql-was-not-a-query-when-executin?answertab=votes#tab-top