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

Python使用pyodbc连接SQL Server调用存储过程获取结构化表格问题

解决方案

问题原因

你当前的代码存在两个可优化点,对应你遇到的两个异常表现:

  • 第一条数据重复:进入while循环前你已经调用cursor.fetchone()获取了第一行并加入列表,循环逻辑中又重复追加了一次第一行数据,导致结果重复
  • 无正确列名:pyodbc的游标返回的行数据默认不会携带字段名,需要手动从游标的description属性中提取列名映射到DataFrame

修复方案1:直接使用cursor处理(适合不想改读入逻辑的场景)

修正后的完整代码如下:

import pyodbc
import pandas as pd

server = '(LocalDb)\LocalDBDemo'
database = 'Test'

try:
    cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};'
                          'SERVER=' + server + ';'
                          'DATABASE=' + database + ';'
                          'trusted_connection=yes;'
                           )
    cursor = cnxn.cursor()
    storedProcedure = "Exec [dbo].[get_Movie]"
    cursor.execute(storedProcedure)
    # 直接获取所有行,不需要手动循环
    rows = cursor.fetchall()
    # 从游标属性提取列名
    columns = [col[0] for col in cursor.description]
    # 生成带正确列名的DataFrame
    df = pd.DataFrame.from_records(rows, columns=columns)
    print(df)
    
except Exception as e:
    print("Error: %s" % e) 

修复方案2:解决pd.read_sql_query大SQL报错问题

你提到的大SQL传入报错大概率是字符串拼接/换行处理不当导致的,使用Python三引号包裹多行SQL语句即可完美解决缩进、换行问题,不需要额外调整SQL本身:

import pyodbc
import pandas as pd

server = '(LocalDb)\LocalDBDemo'
database = 'Test'

try:
    cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};'
                          'SERVER=' + server + ';'
                          'DATABASE=' + database + ';'
                          'trusted_connection=yes;'
                           )
    # 三引号支持任意换行、缩进,直接粘贴你的大SQL即可
    sql = """
    Exec [dbo].[get_Movie]
    -- 这里可以直接粘贴你的完整长SQL,不需要调整原有缩进、换行格式
    """
    df = pd.read_sql_query(sql, cnxn)
    print(df)
    
except Exception as e:
    print("Error: %s" % e) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 13:15:03