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

Django执行含临时表的多行SQL查询报错:无结果返回

解决Django中执行多行MSSQL查询报错的问题

你的问题根源在于:这段SQL脚本包含多个非查询语句(变量声明、临时表创建),Django的数据库cursor默认会尝试获取第一个执行语句的结果——但前面的语句根本没有返回结果集,所以才抛出ProgrammingError: No results. Previous SQL was not a query.错误。

我给你两个关键修复方案,亲测有效:

1. 添加SET NOCOUNT ON;抑制无关结果

在SQL脚本最开头加上这句,因为执行INTO #MT这类语句时,SQL Server会返回“X行受影响”的消息,这个在Django的cursor里会被当作无效结果集干扰后续查询。SET NOCOUNT ON;会让SQL Server不返回这些无关消息,只保留最后那个SELECT的有效结果。

修改后的代码如下:

def merchant_ajax(request):
    data = dict()
    with connections['mssql'].cursor() as cursor:
        query_head = ' '.join((
            "SET NOCOUNT ON;",  # 核心修复:消除无关的行数影响消息
            "DECLARE @Date_From datetime, @Date_To datetime",
            "SET @Date_From = DATEADD(mm, DATEDIFF(mm,0,GETDATE())-1, 0)",
            "SET @Date_To = dbo.dayEnd(GETDATE())",
            "SELECT mt.MarketTourID, sku.SKUPlanID AS SKUPlanID, IIF(InventoryStatus=1,1,0) AS InventoryStatus,mt.CreationDate",
            "INTO #MT FROM MTMerchandasingREF AS mt",
            "JOIN SKUMainREF AS sku ON sku.ID = SKUMainId",
            "WHERE mt.CreationDate BETWEEN @Date_From AND @Date_To",
            "SELECT mt.MarketTourID,skuP.Name AS PlanName,mt.InventoryStatus,mt.CreationDate",
            "FROM #MT AS mt",
            "JOIN SKUPlanREF AS skuP ON skuP.ID = mt.SKUPlanID",
            "WHERE skuP.MerchGroupID IS NOT NULL",
        ))
        cursor.execute(query_head)
        data['data'] = cursor.fetchall()
    return JsonResponse(data,safe=False)

2. (可选)手动跳过前置结果集

如果加了SET NOCOUNT ON;仍有问题,可能存在其他隐藏结果集。这时候可以在execute之后,用nextset()循环跳过所有前置结果,只保留最后一个有效查询的结果:

cursor.execute(query_head)
# 跳过所有非目标结果集
while cursor.nextset():
    pass
data['data'] = cursor.fetchall()

错误原因再梳理

你的SQL是一个多步骤批处理:先声明变量、赋值,再创建临时表,最后才是查询。Django的cursor执行批处理时,会把每一步的返回都当作结果集——但前面的步骤(DECLARE、SET、INTO #MT)都不是查询语句,没有返回数据,直接调用fetchall()时,cursor就会报错“没有结果,之前的SQL不是查询”。加上SET NOCOUNT ON;就能消除这些干扰,让cursor只关注最后那个真正的查询结果。

内容的提问来源于stack exchange,提问作者Bagao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:58:11