Как сохранить выходные данные хранимой процедуры SQL Server с несколькими наборами результатов в каждом кадре данных в пандах - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть хранимая процедура SQL Server, которая возвращает 3 отдельные таблицы.

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

Что-то вроде:

  • df1 - первая таблица
  • df2 - второй стол
  • df3 - третий стол

С чего мне начать смотреть?

Спасибо

import pandas as pd 
import pyodbc 
from datetime import datetime


param = datetime(year=2019,month=7,day=31)
query = """EXECUTE [dbo].PythonTest_USIC_TreatyYear_ReportingPackage  @AsOFDate = '{0}'""".format(param)
conn = pyodbc.connect('DRIVER={SQL Server};server=myserver;DATABASE=mydatabase;Trusted_Connection=yes;')
df = pd.read_sql_query(query, conn)
print(df.head())

1 Ответ

3 голосов
/ 26 сентября 2019

Вы должны иметь возможность просто перебирать наборы результатов, преобразовывать их в DataFrames и добавлять эти DataFrames в список.Например, учитывая хранимую процедуру

CREATE PROCEDURE dbo.MultiResultSP 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT 1 AS [UserID], N'Gord' AS [UserName]
    UNION ALL
    SELECT 2 AS [UserID], N'Elaine' AS [UserName];

    SELECT N'pi' AS [Constant], 3.14 AS [Value]
    UNION ALL
    SELECT N'sqrt_2' AS [Constant], 1.41 AS [Value]
END

, код Python будет выглядеть примерно так:

data_frames = []
crsr = cnxn.cursor()
crsr.execute("EXEC dbo.MultiResultSP")
result = crsr.fetchall()
while result:
    col_names = [x[0] for x in crsr.description]
    data = [tuple(x) for x in result]  # convert pyodbc.Row objects to tuples
    data_frames.append(pd.DataFrame(data, columns=col_names))
    if crsr.nextset():
        result = crsr.fetchall()
    else:
        result = None

# check results
for df in data_frames:
    print(df)
    print()
""" console output:

   UserID UserName
0       1     Gord
1       2   Elaine

  Constant Value
0       pi  3.14
1   sqrt_2  1.41

"""
...