pypyodbc — использование хранимых процедур и сохранение данных в кадре данных

Итак, у меня есть хранимая процедура, к которой я хочу подключиться и выполнить в python, чтобы я мог экспортировать данные в виде причудливой таблицы.

Вот код, который я использую, с комментариями, которые я пробовал.

import plotly as py
import plotly.figure_factory as ff
import pandas as pd
import pypyodbc
import pyodbc
import datetime
import seaborn as sns
import matplotlib.pyplot as plt


#force the ODBC driver to use case-sensitive column names
pypyodbc.lowercase = True  

startdate = '2018-10-23 08:00'
enddate = '2018-10-24 12:00'

params = startdate,enddate

##Establishing a connection to SQL database

connection = pypyodbc.connect('Driver={SQL Server};'
                                'Server=LOLOL;'
                                'Database=LOL_Collection;'
                                'trusted_connection=yes;')
crsr = connection.cursor()

SQL = """

SET NOCOUNT ON
declare @start = '2018-10-23 08:00'
declare @end = '2018-10-24 12:00'
exec [dbo].[AM_SIGNAL_Histogram] @start, @end

"""


#SQL = """
#    
#exec [dbo].[AM_SIGNAL_Histogram] @start, @end
#
#"""


#result = crsr.execute(SQL)
#         
#print(result.fetchall())


df = pd.read_sql(SQL,connection)
connection.close()

И это ошибка, которую я продолжаю получать:

ProgrammingError: («42000», «[42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Неправильный синтаксис рядом с '='.")

Спасибо за помощь, Кеннет


person Kenneth Fernandes    schedule 24.10.2018    source источник
comment
Полная трассировка стека?   -  person pvy4917    schedule 24.10.2018


Ответы (1)


Проблема не в вашем коде Python, а в вашем T-SQL. Запуск его непосредственно в SQL Server Management Studio (SSMS),

SET NOCOUNT ON
declare @start = '2018-10-23 08:00'
declare @end = '2018-10-24 12:00'
exec [dbo].[AM_SIGNAL_Histogram] @start, @end

производит

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '='.
Msg 137, Level 15, State 2, Line 4
Must declare the scalar variable "@start".

В ваших операторах declare отсутствует тип данных. У меня работает следующая модификация:

SET NOCOUNT ON;
declare @start varchar(50) = '2018-10-23 08:00';
declare @end varchar(50) = '2018-10-24 12:00';
exec [dbo].[AM_SIGNAL_Histogram] @start, @end;
person Gord Thompson    schedule 25.10.2018