Python执行SQL存储过程报ProgrammingError:No results问题咨询
报错原因
ProgrammingError :No results. Previous SQL was not a query 触发的核心原因是:SQL Server存储过程执行时,默认会返回每个语句的影响行数消息,Python的数据库驱动(pymssql/pyodbc)会把这些非查询类的消息判定为前置结果集,此时直接调用fetchall()/fetchone()等方法,会因为当前指向的结果不是查询返回的数据集而报错。
SQL客户端不会出现这个问题,是因为客户端默认自动过滤了这些非查询类的返回消息,直接展示最终的SELECT查询结果。
解决方案
二选一即可:
- 方案1(推荐,一劳永逸):修改存储过程,在开头加
SET NOCOUNT ON,阻止返回行数影响消息,驱动就能直接拿到最终查询结果。
存储过程修改示例:CREATE PROCEDURE [dbo].[Usp_Leftsidepanel] @UserId 参数类型与原有定义保持一致 AS BEGIN SET NOCOUNT ON; -- 新增该行即可 -- 原有存储过程业务逻辑无需改动 END - 方案2(无需修改存储过程):调整Python调用逻辑,先关闭计数返回,再跳过前置空结果集定位到最终查询结果。
修改后的接口代码:@api_view(['GET']) def getUtilizationSummary(request, UserId): if request.method == 'GET': cursor = connection.cursor() # 先执行关闭行数返回的配置 cursor.execute("SET NOCOUNT ON;") # 调用目标存储过程 cursor.execute('EXEC [dbo].[Usp_Leftsidepanel] @UserId=%s', (UserId,)) # 跳过所有无字段描述的空结果集,定位到实际返回数据的结果 while cursor.description is None: cursor.nextset() result_set = cursor.fetchall() data = [] for row in result_set: data.append({ 'Utility':row[0], 'Productivity':row[1], 'BreakMeeting':row[2] }) return Response(data)
效果验证
调整完成后,接口返回的数据结构和SQL客户端直接执行存储过程的输出完全一致,无需额外更换结果获取方法。
内容的提问来源于stack exchange,提问作者kelvin003
相关产品推荐
相关产品推荐

