Pyodb c Вызов хранимой процедуры с параметрами - PullRequest
0 голосов
/ 21 апреля 2020

Я пытался вызвать эту хранимую процедуру с параметрами, но безрезультатно. Я думаю, что я понял часть параметров, но теперь я думаю, что я просто неправильно называю хранимую процедуру. Я попытался документировать мои различные подходы как можно лучше с их сообщениями об ошибках (ниже). Как я могу вызвать хранимую процедуру с параметрами и записать в фрейм данных?

Попробуйте A: Использование соединения-заполнителя с параметрами в словаре и% s для переменной

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
placeholders = ','.join('?' for i in range(len(params1.values())))  # '?,?'

interconnectmo1 = """exec TNT.dbo.abc \
    @start_date = %(mo1_start_date)s  -- datetime \
  , @end_date = %(mo1_end_date)s    -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" %placeholders

sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

Ошибка A: Ошибка типа: форматирование требует сопоставления

Попробуйте B: Нет заполнитель присоединяется с параметрами в словаре и? для переменной

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}

interconnectmo1 = """exec TNT.dbo.abc\
    @start_date = ? -- datetime \
  , @end_date = ?    -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" 

sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

Ошибка B: [ODB C SQL Драйвер сервера] Поле COUNT неверно или синтаксическая ошибка (0) (SQLExecDirectW)

Попробуйте C: Использование соединение заполнителя с параметрами в списке и% s для переменной

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
paramsmo1=list(params1.values())
placeholders = ','.join('?' for i in range(len(paramsmo1)))  # '?,?'

interconnectmo1 = """exec TNT.dbo.abc\
    @start_date = %(mo1_start_date)s -- datetime \
  , @end_date = %(mo1_end_date)s    -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" %placeholders

sqlmo1 = pd.read_sql(interconnectmo1, conn, paramsmo1)

ошибка C: ошибка типа: для формата требуется сопоставление

Попробуйте D: нет соединения заполнителя с параметрами в словаре и% s для переменной

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
interconnectmo1 = """exec TNT.dbo.abc\
    @start_date = "%(mo1_start_date)s" -- datetime \
  , @end_date =  "%(mo1_end_date)s"   -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" % (params1)

sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

Ошибка D: Процедура или функция ожидает параметр '@end_date', который не был указан.

Попробуйте E: Попытка с курсором ..

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
csr = conn.cursor()
interconnectmo1 = csr.execute("""exec TNT.dbo.abc \
    @start_date = "%(mo1_start_date)s" -- datetime \
  , @end_date =  "%(mo1_end_date)s"   -- datetime \
  , @syscode = NULL           -- varchar(8000)  \
  , @estimate_ids = NULL       -- varchar(8000)""" % (params1))

csr.execute(interconnectmo1, (params1))

Ошибка E: Процедура или функция ожидает параметр '@end_date', который не был указан.

1 Ответ

0 голосов
/ 27 апреля 2020

Я наконец получил это на работу. С этим кодом возникли две проблемы.

  • Выноски комментариев к типу данных. -- datetime и -- varchar(8000) были проблемой. Даже когда мой код распознал первый параметр, он не смог найти второй параметр из-за этого сбоя.
  • Словарный ввод как параметр просто не работал. Я не уверен, если это не возможность, или я просто не получил правильный синтаксис, чтобы заставить его работать, но это не сработало. Я тоже посмотрел на обязательные параметры - без сигары. Я даже пробовал ввод списка и не был успешным.
mo1_start_date='12/30/2019' 
mo1_end_date='1/26/2020' 
interconnectmo1 = """exec TNT.dbo.abc
@start_date = ? , @end_date =  ? , @syscode = NULL , @estimate_ids = NULL""" 
sqlmo1 = pd.read_sql_query(interconnectmo1, conn, params=(mo1_start_date, mo1_end_date))

Самый простой способ победил. Не было никакой необходимости усложнять это вообще. Если у вас есть словарь и вы не можете получить параметры в этом формате, то, я думаю, вы вынуждены искать решение для словарей. Но для этой проблемы я был тем, кто создавал словарь без необходимости. Я просто перешел к более простому способу определения моих параметров и альта.

Я надеюсь, что это кому-то поможет, потому что мне потребовались дни и НЕСКОЛЬКО кодовых плат, чтобы наконец отказаться от моего предыдущего подхода, чтобы найти этот выигрышный!

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