You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:51:41