Выполнение хранимой процедуры с несколькими параметрами в Python с использованием разных наборов параметров - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно выполнить хранимую процедуру, имеющую 2 параметра даты из Python. Я хочу изменить параметры и выполнить процедуру несколько раз в цикле, используя набор параметров, которые находятся в строках данных. Мой код, как показано ниже;

def _get_dataset(date_param1, data_param2):
    sql="exec [dbo].[SP_Name] (%s,%s)" % (date_param1, 
    date_param2)
    cnxn = pyodbc.connect('DRIVER={SQL 
    Server};SERVER=xxx.xxx.xx.xx;DATABASE=db;UID=userid;PWD=password')
    cursor = cnxn.cursor()
    data = pd.read_sql(sql,cnxn)
    return data 

for i in range(len(dataframe)):
    first_date = df.iloc[i][0]
    second_date = df.iloc[i][1]
    _get_dataset(str(first), str(second))

Ошибка, которую я получаю;

DatabaseError: Execution failed on sql 'exec [dbo].[SP_name] (2019-06-25,2019-06-24)': ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '2019'. (102) (SQLExecDirectW)")

Что не так в коде? Заранее спасибо.

1 Ответ

1 голос
/ 26 июня 2019

У меня нет SQL Server для тестирования, но лучше передать параметры с помощью read_sql, так как он будет использовать базовый драйвер базы данных для безопасной интерполяции строк:

def _get_dataset(date_param1, data_param2):
    sql = "exec [dbo].[SP_Name] (?, ?)" 
    cnxn = pyodbc.connect(
       'DRIVER={SQL Server};SERVER=xxx.xxx.xx.xx;DATABASE=db;UID=userid;PWD=password'
    )
    cursor = cnxn.cursor()
    data = pd.read_sql(sql, cnxn, params=(date_param1, data_param2))
    return data 

Вы также можете использовать ORM, например, SQLAlchemy, чтобы передавать параметры независимым от драйвера способом, поэтому ваш код не привязан к определенному синтаксису драйвера :

In [559]: import sqlalchemy as sa

In [560]: pd.read_sql(sa.text('SELECT * FROM data where Col_1=:col1'), 
   .....:             engine, params={'col1': 'X'})
   .....: 
Out[560]: 
   index  id                        Date Col_1  Col_2  Col_3
   0      0  26  2010-10-18 00:00:00.000000     X   27.5      1
...