web-dev-qa-db-ja.com

Linuxでsqlcmdを使用してSQL Serverに接続する方法

Microsoft ODBC Driver 13 for SQL Server for Ubuntu 16.04マシンをセットアップしました。サーバー名とインスタンス名の両方を含むデータベース接続をテストしようとしています。

次の両方は、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;"

これはバックスラッシュによるものだと私はかなり確信していますが、これを回避する方法を見つけることができません。

7
geographika

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;"
5
geographika

これはMicrosoft odbcドライバーの問題でしたが、Microsoft ODBC Driver 17.4で修正されました。

新しいリリースでは、phpのsqlcmdおよびsqlsrvドライバーは、UDPポート1434を照会して、MSSQLサーバーに名前付きインスタンスのポート番号を要求できます。

2
Catscrash

私のWindowsユーザーは、geographikaの回答で提案されているようにnetstat -abnの実行を許可されていませんでしたが、回避できました。

tasklist | find /i "Ssms.exe"を使用すると、次の結果が得られました。

Ssms.exe                     14144 RDP-Tcp#15                 3       233.384 K

上記の例の14144はPIDです。次にnetstat -oan | find /i "14144"と入力しました

これは(おそらく1行以上)を返します。

TCP    192.168.100.102:60348  192.168.100.102:55600  HERGESTELLT   14144

したがって、接続するポートは55600になります。

この答え は必要なヒントを与えてくれましたが、期待どおりに機能しなかったため、少し調整する必要がありました。

(編集:どういうわけか、すべてをまとめることを忘れていました。)

これで、sqlcmdを使用してIPとポートに接続できます。

sqlcmd -S 192.168.100.102,55600 -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
1
finn_matti