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

Python调用带双参数的SQL Server存储过程无返回行问题排查

解决SQL Server存储过程返回临时表在Python中无法读取的问题

先排查关键错误点

  1. 存储过程名称不匹配:你的Python代码中调用的是clk.get_codes_pdf,但实际定义的存储过程是gen.get_codes,这是明显笔误,必须先修正,否则调用的是不存在的存储过程,自然不会返回数据。
  2. 存储过程语法不完整:你提供的存储过程代码只有BEGIN TRY但缺少对应的BEGIN CATCH块,这会导致存储过程无法正常编译执行,需要补全CATCH块,同时确保#Table确实在存储过程内部被正确创建(比如通过SELECT ... INTO #Table或CREATE TABLE #Table (...)语句)。

Python读取存储过程结果的解决方案

即使修正上述问题,SQLAlchemy的read_sql_query在处理EXEC调用时,有时无法正确捕获临时表的结果集,推荐以下两种可行方式:

方式一:直接使用pyodbc连接执行

绕过SQLAlchemy封装,直接用pyodbc连接获取结果集,这种方式更直接,能确保捕获到临时表的返回数据:

import pyodbc
import pandas as pd

# 构建连接字符串
conn_str = f'DRIVER={driver_2};SERVER={server};DATABASE={database};UID={username};PWD={password}'
# 建立连接
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 执行存储过程,用?作为参数占位符
cursor.execute("EXEC gen.get_codes ?, ?", previous_days_start_value, previous_days_end_value)

# 将结果转换为DataFrame
pdf_df = pd.DataFrame.from_records(
    cursor.fetchall(),
    columns=[col[0] for col in cursor.description]
)

# 关闭连接和游标
cursor.close()
conn.close()

方式二:在SQLAlchemy中使用原始连接

若想继续使用SQLAlchemy的engine,可通过raw_connection()获取底层pyodbc连接执行存储过程:

import sqlalchemy as sal
import pandas as pd

engine = sal.create_engine('mssql+pyodbc://{}:{}@{}/{}?driver={}'.format(username,password,server,database,driver_2))

previous_days_start_value = 1
previous_days_end_value = 10

with engine.raw_connection() as conn:
    cursor = conn.cursor()
    cursor.execute("EXEC gen.get_codes ?, ?", previous_days_start_value, previous_days_end_value)
    pdf_df = pd.DataFrame.from_records(
        cursor.fetchall(),
        columns=[col[0] for col in cursor.description]
    )
    cursor.close()

额外注意事项

  • 确保SET NOCOUNT ON;在存储过程的BEGIN TRY块内,它会抑制SQL Server返回的计数消息,避免干扰结果集捕获。
  • 如果存储过程内部有多个结果集,可通过cursor.nextset()跳过空结果集,直到找到有数据的结果集。

内容的提问来源于stack exchange,提问作者C_Gavin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:25:57