【问题标题】:How to save output of SQL Server stored procedure with multiple result sets into each dataframe in pandas如何将具有多个结果集的 SQL Server 存储过程的输出保存到 pandas 中的每个数据框中
【发布时间】:2019-09-25 23:19:39
【问题描述】:

我有一个返回 3 个单独表的 SQL Server 存储过程。

如何使用 pandas 将每个表存储在不同的数据框中?

类似:

  • 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】:

    您应该能够遍历结果集,将它们转换为 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
    
    """
    

    【讨论】:

    • 谢谢!这带来了两个结果集。但是有什么办法可以将它们中的每一个分配给不同的数据框?比如说df1 = [first output]df2 = [second output] 等等。 ?
    • 不是循环,而是创建df1,然后调用nextset(),然后创建df2,以此类推。
    • 谢谢,对不起,我是 python 新手,所以对于最后一个“for 循环”,我需要:#check result df1 = [] if cursor.nextset()==True: df1=cursor.nextset() print(df1)
    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多