如何通过Python的SQL Alchemy调用Microsoft SQL Server存储过程
使用SQLAlchemy调用SQL Server带参数的存储过程
以下是几种适配你现有环境的可行实现方式:
方法1:SQLAlchemy + Pandas 绑定参数执行
利用SQLAlchemy的text对象处理原生SQL,通过参数绑定传递存储过程入参,既安全又能避免SQL注入问题:
from sqlalchemy import create_engine, text 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) # 定义存储过程参数 period_start = 202212 period_end = 202310 # 构造带参数绑定的存储过程调用语句 query = text(""" EXEC [Reporting].[Finance_Payments_Mvmts_sp] @PeriodStart = :start, @PeriodEnd = :end """) # 执行并将结果存入DataFrame df = pd.read_sql_query(query, engine, params={"start": period_start, "end": period_end})
如果需要捕获存储过程的返回值(即你SQL示例中的@return_value),可以通过连接对象单独查询:
with engine.connect() as con: # 执行存储过程 result = con.execute(query, {"start": period_start, "end": period_end}) # 读取结果集到DataFrame df = pd.DataFrame(result.fetchall(), columns=result.keys()) # 获取返回值 return_value = con.execute(text("SELECT @@RETURN_VALUE")).scalar() print(f"存储过程返回值:{return_value}")
方法2:直接使用PyODBC(备选方案)
如果SQLAlchemy方式出现兼容性问题,可直接用PyODBC连接执行,逻辑更直观:
import pyodbc import pandas as pd Server='Jaar' Database='M' Driver='ODBC Driver 17 for SQL Server' # 构造连接字符串 conn_str = f'DRIVER={{{Driver}}};SERVER={Server};DATABASE={Database};Trusted_Connection=yes;' with pyodbc.connect(conn_str) as conn: cursor = conn.cursor() # 执行存储过程(用?作为参数占位符) cursor.execute("EXEC [Reporting].[Finance_Payments_Mvmts_sp] @PeriodStart = ?, @PeriodEnd = ?", (202212, 202310)) # 将结果转为DataFrame df = pd.DataFrame.from_records(cursor.fetchall(), columns=[col[0] for col in cursor.description]) # 获取返回值 cursor.execute("SELECT @@RETURN_VALUE") return_value = cursor.fetchone()[0] print(f"存储过程返回值:{return_value}")
注意事项
- 优先使用参数绑定(
:参数名或?),禁止直接字符串拼接参数,防止SQL注入风险。 - 确保你的数据库账号拥有
[Reporting].[Finance_Payments_Mvmts_sp]存储过程的执行权限。 - 如果存储过程返回多个结果集,可通过
result.nextset()遍历获取后续结果。
内容的提问来源于stack exchange,提问作者Shaye
相关产品推荐
相关产品推荐

