Как параметризовать отметку даты в запросе pyODBC?

Я использую pyodbc вместе с _ 2_ для создания запроса ODBC.

У меня не получается вставить параметры отметки даты. Здесь вы можете увидеть эскалацию, начиная с буквальной версии (1) и заканчивая версией в строковом формате (2) и версиями с состоянием ошибки. (Примечание DateFrom & DateTo):

  1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = {d'2018-02-12'}, DateTo = {d'2018-02-18'}, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

  2. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = %s, DateTo = %s, SummarizeColumnsBy='TotalOnly', ReturnRows='All'" % (q_startdate, q_enddate)

Последующие попытки с синтаксисом вставки ?, cursor.execute(sql, (q_startdate), (q_enddate)) и переменными:

q_startdate = ("{d'%s'}" % dates[0])
q_enddate = ("{d'%s'}" % dates[1])
  1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = ?, DateTo = ?, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

>>> ('HY004', '[HY004] [Microsoft][ODBC Driver Manager] SQL data type out of range (0) (SQLBindParameter)')

q_startdate = (dates[0])
q_enddate = (dates[1])
  1. sql = "sp_report ProfitAndLossStandard show Amount_Title, Text, Label, Amount parameters DateFrom = {d'?'}, DateTo = {d'?'}, SummarizeColumnsBy='TotalOnly', ReturnRows='All'"

>>> ('42000', "[42000] [QODBC] [sql syntax error] Expected lexical element not found: = {d'?'} (11015) (SQLPrepare)")

Читая pyodbc страницу Wiki о вставке данных, я не Не читал ни о каких лежачих полицейских с прошивкой. Это должно иметь какое-то отношение к тому, как pyodbc обрабатывает (экранирует) метку даты.

Как вы параметризуете отметку даты - особенно с qodbc разновидность отметки даты.


person xtian    schedule 24.07.2018    source источник
comment
Работает ли ваш запрос, если значения параметров верны Python date значения (например, q_startdate = date(2018, 2, 12)), а вы просто используете ... DateFrom = ? ...?   -  person Gord Thompson    schedule 24.07.2018
comment
Это работает. Спасибо. Если хотите, дайте ответ, и я дам вам правильные ответы.   -  person xtian    schedule 25.07.2018


Ответы (1)


Практически никогда не требуется использовать escape-последовательности ODBC, такие как {d'2018-02-12'}, в параметризованном запросе pyodbc. Если значение параметра является истинным объектом date Python

q_startdate = date(2018, 2, 12)

тогда pyodbc сообщит драйверу ODBC, что значение параметра равно SQL_TYPE_DATE, как показано в журнале трассировки ODBC

[ODBC][2984][1532535987.825823][SQLBindParameter.c][217]
        Entry:
            Statement = 0x1f1a6b0
            Param Number = 1
            Param Type = 1
            C Type = 91 SQL_C_TYPE_DATE
            SQL Type = 91 SQL_TYPE_DATE
            Col Def = 10
            Scale = 0
            Rgb Value = 0x1f3ac78
            Value Max = 0
            StrLen Or Ind = 0x1f3ac58

и мы можем просто использовать пустой параметр-заполнитель в тексте нашей команды SQL

... parameters DateFrom = ?, ...
person Gord Thompson    schedule 25.07.2018