如何将具有多个结果集的SQL Server存储过程的输出保存到大熊猫的每个数据框中

问题描述 投票:0回答:1

我有一个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())
python sql-server pandas pyodbc
1个回答
1
投票

您应该能够仅遍历结果集,将它们转换为DataFrame,然后将这些DataFrame附加到列表中。例如,给定存储过程

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

"""
© www.soinside.com 2019 - 2024. All rights reserved.