为何SSMS可连接SQL Server但sqlcmd出现连接超时?
这种情况我之前帮同事排查过好几次,大概率是下面几个原因导致的,你可以挨个试试:
协议启用或优先级差异
SSMS连接时会自动尝试多种协议(比如TCP/IP、命名管道),但sqlcmd默认可能只优先使用了部分协议。你可以打开SQL Server配置管理器:- 找到SQL Server网络配置,确认目标实例的TCP/IP协议已启用;
- 再看SQL Native Client配置里的客户端协议,把TCP/IP调整到优先级最高的位置,避免
sqlcmd优先尝试其他不通的协议。
防火墙或进程级网络限制
虽然SSMS能连上,但有可能你的工作站防火墙对sqlcmd进程单独做了拦截,或者服务器端防火墙针对命令行工具的流量有特殊规则。你可以临时关闭工作站的防火墙测试一下,或者在服务器端检查是否有针对特定客户端程序的端口过滤规则。sqlcmd版本兼容性问题
如果你的sqlcmd是从高版本SQL Server(比如2019/2022)安装的,连接2012版本数据库时可能存在协议协商的兼容性问题。建议你试试用SQL Server 2012自带的sqlcmd,路径一般是C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd.exe,直接用这个路径执行命令试试。默认连接超时时间过短
SSMS默认的连接超时可能比sqlcmd长(sqlcmd默认登录超时是15秒),如果网络延迟稍高就会超时。你可以手动指定更长的超时时间,执行命令:sqlcmd -S server,port -E -l 60,这里-l 60是把登录超时设置为60秒,看看能不能成功。DNS解析或网络路由差异
有时候SSMS会用本地缓存的DNS记录,而sqlcmd重新解析DNS时出了问题,或者两者的网络路由路径不同。你可以试试用服务器的IP地址代替服务器名称,比如执行sqlcmd -S 192.168.x.x,port -E,如果能连上,那就是DNS解析的问题。
内容的提问来源于stack exchange,提问作者user1185417

