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

Python脚本执行SQL Server SELECT语句报错求助

Python从SQL Server查询数据写入Excel时出现HY010错误的解决方法

问题描述

执行Python脚本从Microsoft SQL Server查询数据并写入Excel时,触发以下错误:

Traceback (most recent call last):
  File "C:\Users\rrw\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\cursor.py", line 955, in fetchone
    row = dbapi_cursor.fetchone()
pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC Driver 17 for SQL Server]Function sequence error (0) (SQLFetch)')     

Traceback (most recent call last):
  File "F:\Astro\Python\AstroPy\WriteSQLData.py", line 91, in <module>
    for row in rs:

错误指向脚本末尾的for row in rs行,原脚本如下:

from sqlalchemy import create_engine
from sqlalchemy.engine import URL
import pyodbc
import pandas as pd
import csv
import configparser

# Get data from configuration ini file
config = configparser.ConfigParser()
config.read('databaseConfig.ini')
destinationFile = config['destination']['fileName']

# Database Connection Code
connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=ASTROLAB;DATABASE=AstronomyMaps;UID=xyz;PWD=xyz"
connection_url = URL.create(
    "mssql+pyodbc", query={"odbc_connect": connection_string})

engine = create_engine(connection_url)

# Simple test query
qry = "SELECT TOP (1000) * FROM [AstronomyMaps].[dbo].[starMapA]"
with engine.connect() as con:
    rs = con.execute(qry)
    
# Write query data to Excel spreadsheet 
with open(destinationFile, 'w', newline='') as f:
    a = csv.writer(f, delimiter=',')
    a.writerow([x[0] for x in cursor.description])
    a.writerows(row)

    for row in rs:
        print(row)

问题原因及解决方法

核心问题1:连接上下文提前关闭

with engine.connect() as con:是上下文管理器,代码块执行完毕后会自动关闭数据库连接。而rs是基于该连接的结果集,连接关闭后再遍历rs就会触发HY010函数序列错误。

核心问题2:其他逻辑错误

  • 使用了未定义的cursor变量,cursor.description会直接抛出NameError
  • a.writerows(row)中的row未定义,且writerows需要传入可迭代的行集合,而非单个行
  • 文件写入与结果集遍历的顺序逻辑混乱

修正后的脚本

from sqlalchemy import create_engine
from sqlalchemy.engine import URL
import csv
import configparser

# 读取配置文件
config = configparser.ConfigParser()
config.read('databaseConfig.ini')
destinationFile = config['destination']['fileName']

# 构建数据库连接
connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=ASTROLAB;DATABASE=AstronomyMaps;UID=xyz;PWD=xyz"
connection_url = URL.create(
    "mssql+pyodbc", query={"odbc_connect": connection_string})

engine = create_engine(connection_url)

qry = "SELECT TOP (1000) * FROM [AstronomyMaps].[dbo].[starMapA]"

# 在连接上下文内处理结果集
with engine.connect() as con:
    rs = con.execute(qry)
    # 获取查询列名
    column_names = [x[0] for x in rs.cursor.description]
    
    # 写入CSV文件
    with open(destinationFile, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=',')
        writer.writerow(column_names)
        # 遍历结果集,同时打印并写入
        for row in rs:
            print(row)
            writer.writerow(row)

额外优化建议

既然已导入pandas,可以用更简洁的方式完成查询与写入操作,无需手动处理CSV逻辑:

from sqlalchemy import create_engine
from sqlalchemy.engine import URL
import pandas as pd
import configparser

config = configparser.ConfigParser()
config.read('databaseConfig.ini')
destinationFile = config['destination']['fileName']

connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=ASTROLAB;DATABASE=AstronomyMaps;UID=xyz;PWD=xyz"
connection_url = URL.create(
    "mssql+pyodbc", query={"odbc_connect": connection_string})

engine = create_engine(connection_url)

qry = "SELECT TOP (1000) * FROM [AstronomyMaps].[dbo].[starMapA]"
# 直接用pandas读取查询结果并写入Excel
df = pd.read_sql(qry, engine)
df.to_excel(destinationFile, index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:01:04