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
相关产品推荐
相关产品推荐

