Sql-Server

如何在 Linux 上使用 sqlcmd 連接到 SQL Server?

  • July 8, 2021

我已經在 Ubuntu 16.04 機器上為 SQL Server 設置了 Microsoft ODBC Driver 13。我現在正在嘗試測試一個數據庫連接,其中包括伺服器名稱和實例名稱。

以下兩者都可以在 Windows 機器上正常工作:

sqlcmd -S "SERVERNAME\INSTANCENAME" -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
sqlcmd -S SERVERNAME\INSTANCENAME -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"

然而,它們都不能在 Linux 上執行——它們都返回下面的錯誤消息。該錯誤意味著找不到伺服器:

Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : MAX_PROVS: Error Locating Server/Instance Specified [xFFFFFFFF]. .
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

我還嘗試使用相同的錯誤(以及單引號和雙引號)轉義反斜杠。

sqlcmd -S "SERVERNAME\\INSTANCENAME" -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
sqlcmd -S SERVERNAME\\INSTANCENAME -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"

但是,驅動程序正在工作,因為我可以連接到沒有實例名稱的不同伺服器:

sqlcmd -S SERVERNAME -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"

我相當肯定這是由於反斜杠,但找不到解決這個問題的方法。

在 Dan Guzman 的評論的幫助下,我得到了使用埠的連接。

我有一台帶有 SQL Management Studio 的 Windows 機器連接到有問題的數據庫,並使用:

netstat -abn

然後我搜尋 ssms.exe 以獲取連接詳細資訊:

TCP    192.168.0.31:50777     192.168.0.78:49399     ESTABLISHED [Ssms.exe]

或者,登錄數據庫伺服器並在 SQL Server 配置管理器中查看實例使用的埠(SQL Server 網路配置 > INSTANCENAME 的協議 > TCP/IP > 屬性 > IPAll TCP 動態埠)。

然後以下都起作用:

sqlcmd -S 192.168.0.78,49399 -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
sqlcmd -S SERVERNAME,49399 -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"

這是 microsoft odbc 驅動程序的問題,已通過 Microsoft ODBC Driver 17.4 修復

在新版本中,用於 php 的 sqlcmd 和 sqlsrv 驅動程序能夠查詢 UDP 埠 1434 以向 MSSQL Server 詢問命名實例的埠號

引用自:https://dba.stackexchange.com/questions/147185