You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:05:30