使用 SQLCMD 实用工具时出现间歇性连接错误

本文可帮助你解决使用 SQLCMD 命令行工具时出现的间歇性连接“OS 错误 10054”问题。

错误

会收到以下警告和错误消息:

警告:proc_procname返回的 HResult 0x2746级别 16,状态 1

TCP 提供程序:远程主机强行关闭了现有连接。

SQLCMD.EXE: Sqlcmd: 错误: Microsoft SQL Server Native Client 10.0: 客户端无法建立连接

这些错误的一个可能原因是驱动程序不受支持。

要考虑的问题

查看以下方案以确定问题是否匹配:

  • 收集网络跟踪并了解 TLS 1.0 和 1.1 已禁用,并且已启用 TLS 1.2。 在运行 SQL Server 的服务器上,应用程序服务器上启用了 TLS 1.0、1.1 和 1.2。

    显示 TLS 1.0、1.1 和 1.2 在应用程序服务器上启用的屏幕截图。

  • 使用 Microsoft OLE DB Provider for SQL Server 和 SNAC 11 提供程序在应用程序服务器上运行 UDL 测试 。 连接失败。 你还会收到一条消息,指出“Microsoft OLE DB Provider for SQL Server”驱动程序已弃用,并且不支持 TLS 1.2。

  • 应用程序服务器使用 SQL Server Native Client 11 成功测试 ODBC 数据源。 如果不支持 SQL Server Native Client 10.0,可能会收到以下错误消息:

    连接失败,SQL 状态为“08001”SQL Server 错误:10054 [Microsoft][SQL Server Native Client 10.0]TCP 提供程序:远程主机强行关闭现有连接。 [Microsoft][SQL Server Native Client 10.0]客户端无法建立连接。

    可能会显示此消息,因为应用程序服务器使用旧版 Diffie-Hellman 算法 (v1),SQL Server 使用较新版本 (v2)。 这种不匹配会导致间歇性 TLS 失败。

解决方法

若要解决这些问题,请执行以下步骤:

  1. 在连接字符串中指定 SQL Server Native Client 11。

    注意

    Microsoft不再支持 SNAC 11。 如果在使用 SNAC 11 时遇到任何问题,则必须升级到受支持的 Microsoft 驱动程序版本,然后才能提供技术支持。

  2. 将应用程序驱动程序升级到受支持的驱动程序。

  3. 如果不对连接使用加密,请使用 MSOLEDBSQL v18 或 ODBC v17。 如果对应用程序服务器上的连接使用加密,请使用 MSOLEDBSQL v19 或 ODBC v18。 默认情况下,这些驱动程序与加密一起包含在一起。 有关详细信息,请参阅以下文章:

另请参阅

远程主机强行关闭了现有连接(OS 错误 10054)