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参数。
验证步骤
- 先测试清理后的
query.sql,用原代码执行看是否返回结果 - 多批处理场景使用方案2的拆分执行逻辑
- 确保资源释放语句正确,避免后续连接异常
内容的提问来源于stack exchange,提问作者Yakuman
相关产品推荐
相关产品推荐

