如何使用 SQL 炼金术从 Python 中调用 Microsoft SQL Server 存储过程

How to call Microsoft SQL Server Stored Procedure from within Python using SQL Alchemy

提问人:Shaye 提问时间:11/9/2023 最后编辑:Gord ThompsonShaye 更新时间:11/10/2023 访问量:49

问:

我想使用 Python 和 SQL Alchemy 执行驻留在 Microsoft SQL Server 上的存储过程。

到目前为止,我能够连接到 Microsoft SQL Server,运行简单的选择查询,将其分配给 Panda 数据帧并使用以下代码将其保存到 csv 文件:

from sqlalchemy import create_engine
import pandas as pd
Server='Jaar'
Database='M'
Driver='ODBC Driver 17 for SQL Server'
Database_Con = f'mssql://@{Server}/{Database}?driver={Driver}'
engine=create_engine(Database_Con)
con = engine.connect()
df=pd.read_sql_query("SELECT * FROM [M].[Dim].[Accounts_t]",con)

但是,我尝试对采用两个参数的 SP 执行相同的操作,但没有成功

此外,我无法让这个例子起作用:https://sql-query.dev/articles/1767

并且在 SQL Alchemy 文档中没有找到太多可以帮助我的东西。

谢谢

我要执行的 SP 如下:

USE [M]
GO

DECLARE @return_value int

EXEC    @return_value = [Reporting].[Finance_Payments_Mvmts_sp]
        @PeriodStart = 202212,
        @PeriodEnd = 202310

SELECT  'Return Value' = @return_value

GO
python-3.x sql-server pandas 存储过程 sqlalchemy

评论

0赞 Xedni 11/9/2023
我相信你可以把你的执行语句放到电话中。不过,请确保参数化查询,而不是直接插值参数值。看看这是否对你有帮助:带参数的 Pandas read_sqlread_sql_query
0赞 Shaye 11/9/2023
@Xedni 这根本行不通。我用没有参数的 SP 尝试过。我想它不希望在存储过程之前出现 EXEC 这个词
0赞 Xedni 11/9/2023
你提到它不起作用;你能详细说说吗?您是否收到错误消息?结果集是否为空?
1赞 AlwaysLearning 11/9/2023
我不认为SQLAlchemy打算直接处理多个结果集(我在这里假设您的存储过程返回自己的结果集,然后选择这样的结果集将是第二个单独的结果集)。您是否考虑过使用 SQLAlchemy 来访问多个结果集@return_valueengine.raw_connection()
0赞 Shaye 11/9/2023
@AlwaysLearning我应该补充一点,我实际上不需要返回值。我只需要像这样执行 SP:EXEC [报告]。[Finance_Payments_Mvmts_sp]PeriodStart = 202212,PeriodEnd = 202310,即使用两个参数

答:

0赞 Shaye 11/10/2023 #1

我无法使用 SQL Alchemy 和 SQL Server,所以我终于找到了另一个用于访问 SQL Server 的 Python 模块,称为 pymssql:

import pymssql
import pandas as pd
conn = pymssql.connect(server = 'Jaar', database = 'M')
cursor = conn.cursor(as_dict=True)
PeriodStart = 202212
PeriodEnd = 202310
cursor.callproc('[Reporting].[Finance_Payments_Mvmts_sp]', (PeriodStart, PeriodEnd))
(202212, 202310)
rows = []
for row in cursor:
    rows.append(row)

df = pd.DataFrame(rows)
print(df)

df.to_csv("TestOutput.csv")

我需要它做什么,即使用输入参数运行SQL Server存储过程

https://pypi.org/project/pymssql/