存储过程多表 - PYODBC - Python
Stored Procedure Multiple Tables - PYODBC - Python
我正在尝试执行具有 20 个不同 table 输出的存储过程。这些输出范围为 3-6 列和 10-100 行。如果不是 pyodbc,我还能如何在没有相同结构的情况下遍历所有这些 tables?
connection = pyodbc.connect(r'DRIVER={SQL Server Native Client
11.0};SERVER=dsdrsossql2;DATABASE=TableauDev;Trusted_Connection=yes;')
sql = "{call dbo.DGGrading}"
cur = connection.cursor()
rows = cur.execute(sql,).fetchall()
columns = [column[0] for column in cur.description]
df = pd.DataFrame.from_records(rows,columns=columns)
print(df)
考虑使用数据框列表并使用 nextset()
:
访问多个结果集
cur = connection.cursor()
df_list = []
# FIRST RESULTSET
rows = cur.execute(sql).fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
print(df.head())
# SUBSEQUENT RESULTSETS
while (cur.nextset()):
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
print(df.head())
cur.close()
# RUN ANY DATAFRAME OPERATION BY EACH ITEM OF df_list
df_list[[1]].describe()
df_list[[2]].head()
df_list[[3]].tail()
df_list[[4]].dtypes
df_list[[5]].columns
Parfait 的代码对我不起作用,因为 'subsequent resultset' 缺少一行代码来提取下一个 table。我没有足够的评论点,所以这是对我有用的代码。
一些额外的事情
- 对于 MSSQL,无法识别 CALL,因此使用了 EXEC
- 确保 SET NOCOUNT ON 在存储过程中,否则 fetchall 不会正确地拉入 tables
param1 = "dynamic parameter1"
param2 = "dynamic parameter2"
sql = f"EXEC dbo.StoredProcedure '{param1}', '{param2}'"
cur = cnxn.cursor()
df_list = []
# get First result
rows = cur.execute(sql).fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
# check for more results
while (cur.nextset()):
rows = cur.fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
cur.close()
我正在尝试执行具有 20 个不同 table 输出的存储过程。这些输出范围为 3-6 列和 10-100 行。如果不是 pyodbc,我还能如何在没有相同结构的情况下遍历所有这些 tables?
connection = pyodbc.connect(r'DRIVER={SQL Server Native Client
11.0};SERVER=dsdrsossql2;DATABASE=TableauDev;Trusted_Connection=yes;')
sql = "{call dbo.DGGrading}"
cur = connection.cursor()
rows = cur.execute(sql,).fetchall()
columns = [column[0] for column in cur.description]
df = pd.DataFrame.from_records(rows,columns=columns)
print(df)
考虑使用数据框列表并使用 nextset()
:
cur = connection.cursor()
df_list = []
# FIRST RESULTSET
rows = cur.execute(sql).fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
print(df.head())
# SUBSEQUENT RESULTSETS
while (cur.nextset()):
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
print(df.head())
cur.close()
# RUN ANY DATAFRAME OPERATION BY EACH ITEM OF df_list
df_list[[1]].describe()
df_list[[2]].head()
df_list[[3]].tail()
df_list[[4]].dtypes
df_list[[5]].columns
Parfait 的代码对我不起作用,因为 'subsequent resultset' 缺少一行代码来提取下一个 table。我没有足够的评论点,所以这是对我有用的代码。
一些额外的事情
- 对于 MSSQL,无法识别 CALL,因此使用了 EXEC
- 确保 SET NOCOUNT ON 在存储过程中,否则 fetchall 不会正确地拉入 tables
param1 = "dynamic parameter1"
param2 = "dynamic parameter2"
sql = f"EXEC dbo.StoredProcedure '{param1}', '{param2}'"
cur = cnxn.cursor()
df_list = []
# get First result
rows = cur.execute(sql).fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
# check for more results
while (cur.nextset()):
rows = cur.fetchall()
columns = [column[0] for column in cur.description]
df_list.append(pd.DataFrame.from_records(rows, columns=columns))
cur.close()