Как я могу ввести переменную Python в хранимую процедуру? - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно запросить базу данных SQL, используя конкретное значение из моего скрипта Python, вот что у меня есть:

conn = pyodbc.connect('<SQL-CREDENTIALS-HERE>')

# Create a cursor from the connection

crsr = conn.cursor()
sql = """\
DECLARE @DATA1 AS var_num;
DECLARE @DATA2 OUTPUT;

EXEC EXT_GetDATA
        @DATA1,
        @DATA2;

"""
crsr.execute(sql)   

Для этого я получаю сообщение об ошибке. DATA1 - недопустимый тип данных, я пишу запрос sqL, верно? Обратите внимание, что var_num вытащен ранее в сценарии и здесь не показан.

РЕДАКТИРОВАТЬ: я также попробовал следующий метод и все еще не повезло:

conn = pyodbc.connect ('')

# Create a cursor from the connection

crsr = conn.cursor()
sql = """\
DECLARE @DATA1 CHAR(20);
SET DATA1 = var_num;

DECLARE @DATA2 NVARCHAR;

EXEC EXT_GetDATA
        @DATA1,
        @DATA2 OUTPUT;

"""
crsr.execute(sql)

Однако это все еще не работает и возвращает ошибку:

Exception has occurred: ProgrammingError
(Invalid column name 'var_num'. (207) (SQLExecDirectW)")

Может кто-нибудь сказать мне, что я делаю неправильно, я не хочу устанавливать var_num в качестве имени столбца ??

1 Ответ

1 голос
/ 09 апреля 2019

Как показано в pyodbc Wiki , что-то вроде этого должно работать:

crsr = conn.cursor()
sql = """\
DECLARE @out NVARCHAR(max);
EXEC EXT_GetDATA
        @DATA1 = ?,
        @DATA2 = @out OUTPUT;
SELECT @out AS output_value;
"""
crsr.execute(sql, var_num)  # pass `var_num` as input parameter value
the_output = crsr.fetchval()  # retrieve output parameter value
...