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

Python执行.sql文件中多行SQL查询无结果?求解决方案

问题解决:Python读取多行SQL文件执行无结果的修复方案

核心原因分析

你的问题大概率是以下任一原因导致:

  • 多行SQL文件中包含SSMS支持但pymssql不兼容的GO批处理分隔符
  • 跨平台换行符(Windows的\r\n/Linux的\n)导致SQL语句解析异常
  • SQL中存在未被正确处理的注释块,干扰语句执行

具体修复方案

方案1:清理SQL文件中的不兼容内容

打开query.sql,删除所有GO关键字,同时清理多余空行和跨行注释。例如:
原SQL(含GO):

SELECT * FROM table_a WHERE id > 100;
GO
SELECT name FROM table_b;

修改后:

SELECT * FROM table_a WHERE id > 100;
SELECT name FROM table_b;

方案2:统一处理SQL语句并拆分执行

如果需要保留多批处理逻辑,在Python中读取后拆分语句逐个执行,同时兼容跨平台换行符:
修改Test.py中的SQL读取与执行逻辑:

with open(sql_query_file, 'r', encoding='utf-8') as query_file:
    # 统一换行符并拆分语句,过滤空内容
    sql_content = query_file.read().replace('\r\n', ' ').replace('\n', ' ')
    sql_queries = [q.strip() for q in sql_content.split(';') if q.strip()]

conn = pymssql.connect(server=server, user=username, password=password, database=database)
cursor = conn.cursor()

for query in sql_queries:
    if query:
        cursor.execute(query)
        # 仅处理SELECT语句的结果输出
        if query.strip().upper().startswith('SELECT'):
            result = cursor.fetchall()
            for row in result:
                print(row)

方案3:修复资源释放的代码错误

原代码中cursor.close和conn.close缺少调用括号,会导致数据库资源泄漏,修正为:

finally:
    if cursor:
        cursor.close()
    if conn:
        conn.close()

方案4:添加调试日志排查问题

在执行SQL前打印读取到的内容,确认是否与SSMS中执行的一致:

with open(sql_query_file, 'r', encoding='utf-8') as query_file:
    sql_query = query_file.read()
    print("执行的SQL内容:\n", sql_query)  # 调试用打印

如果打印内容异常,说明文件编码或读取方式有问题,需确认SQL文件的编码格式(如UTF-8、GBK)并对应设置encoding参数。

验证步骤

  1. 先测试清理后的query.sql,用原代码执行看是否返回结果
  2. 多批处理场景使用方案2的拆分执行逻辑
  3. 确保资源释放语句正确,避免后续连接异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:08:31