通过批处理文件连接SQL Server运行批量SQL脚本时出现连接报错
问题根因
你当前使用的批处理逻辑为每一个.sql文件单独创建一次sqlcmd数据库连接,短时间内高频创建、销毁连接会触发两类问题:
- SQL Server侧的瞬时并发连接数达到阈值,被服务端拒绝新的连接请求
- 客户端操作系统的临时端口被大量TIME_WAIT状态的连接占满,无法分配新的端口建立连接
这就是前5-6个文件可以正常执行,后续连接失败的核心原因,和单次任务总量没有直接关系,问题出在连接创建的逻辑上。
解决方法
最优方案:复用单连接执行所有SQL
只创建一次数据库连接,批量执行所有SQL文件,完全规避高频连接问题,同时大幅提升执行效率:
- 先遍历目录下所有SQL文件,生成一个统一的入口执行文件,用SQLCMD支持的
:r命令引入所有待执行文件 - 仅调用一次sqlcmd执行这个入口文件即可
对应批处理代码如下:
@echo off :: 先删除旧的汇总文件(如果存在) del all.sql /f /q :: 遍历所有sql文件,写入引入命令到汇总文件 for %%G in (*.sql) do echo :r "%%~fG" >> all.sql :: 单次连接执行所有SQL sqlcmd /S ServerName /d MyDatabase -U MyUser -P "MyPassword" -i "all.sql" :: 执行完成后删除临时汇总文件 del all.sql /f /q
备用方案:保留单文件单执行逻辑,增加缓冲配置
如果业务要求每个SQL文件必须单独执行、单独判断执行结果,可以修改批处理增加连接超时设置和执行间隔,给端口回收留足够时间:
@echo off for %%G in (*.sql) do ( :: 增加-l 30参数,将连接超时时间延长到30秒 sqlcmd /S ServerName /d MyDatabase -U MyUser -P "MyPassword" -l 30 -i "%%G" :: 每次执行后等待1秒,缓解短时间连接压力 timeout /t 1 /nobreak > nul )
辅助优化项
- 检查SQL Server的
max_connections配置,确认没有设置过小的连接上限 - 确认客户端和服务端之间的防火墙、安全组没有限制短时间内的新建连接数
内容的提问来源于stack exchange,提问作者Brian Karabinchak
相关产品推荐
相关产品推荐

