Выполнить запрос с многострочной строкой - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь получить прямой доступ к БД и отобразить данные на моей веб-странице.Все работает правильно с однострочным SQL-запросом, но многострочными.Мой SQL-запрос состоит из множества соединений и использует временные таблицы!Я пытался

def merchant_ajax(request):
    data = dict()
    with connections['mssql'].cursor() as cursor:
        query_head = ' '.join((
            "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)

Мой запрос работает правильно в SQl Operations Studio, но я не могу реализовать его в django.

Я получаю сообщение об ошибке django.db.utils.ProgrammingError: No results. Previous SQL was not a query.

1 Ответ

0 голосов
/ 19 февраля 2019

Ваша проблема здесь в том, что pyodbc может выполнять только один запрос за раз.Вам нужно будет сделать что-то вроде этого:

from django.db import connections

with connections['mssql'].cursor() as cursor:
    query = """
        DECLARE @Date_From datetime, @Date_To datetime;

        SET @Date_From = DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0);

        SET @Date_To = GETDATE();

        SELECT @Date_From AS date_from, @Date_To AS date_to
    """

    cursor.execute(query)
    result = cursor.fetchall()

    date_from = result[0][0]
    date_to = result[0][1]

    query = """
        SELECT %s AS date_from, %s AS date_to
        INTO #temptable
    """
    cursor.execute(query, (date_from, date_to))

    query = """
        SELECT * FROM #temptable
    """

    cursor.execute(query)
    result = cursor.fetchall()

Однако в этом случае может быть проще создать хранимую процедуру и вызывать ее из Django.

Я рефакторингв прошлом подобные процессы использовали Django ORM и Python вместо того, чтобы полагаться на T-SQL, и это сделало мою жизнь намного проще;это займет немного времени, чтобы учиться.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...