web-dev-qa-db-fra.com

Comment se connecter à SQL Server à l'aide de sqlcmd sous Linux?

J'ai configuré le pilote Microsoft ODBC 13 pour SQL Server sur une machine Ubuntu 16.04. J'essaie maintenant de tester une connexion à la base de données, qui comprend à la fois le nom du serveur et le nom de l'instance.

Les deux éléments suivants fonctionnent correctement à partir d'une machine 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;"

Cependant, aucun d'entre eux ne fonctionne sous Linux - ils renvoient tous le message d'erreur ci-dessous. L'erreur implique que le serveur est introuvable:

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..

J'ai également essayé d'échapper à la barre oblique inverse avec la même erreur (et avec des guillemets simples et doubles).

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

Le pilote fonctionne cependant car je peux me connecter à un autre serveur sans nom d'instance:

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

Je suis assez certain que cela est dû à la barre oblique inverse, mais je ne trouve pas de moyen de contourner ce problème.

7
geographika

Avec l'aide du commentaire de Dan Guzman, j'ai réussi à faire fonctionner la connexion à l'aide d'un port.

J'avais une machine Windows avec SQL Management Studio connectée à la base de données en question et j'ai utilisé:

netstat -abn

Ensuite, j'ai recherché ssms.exe pour les détails de connexion:

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

Connectez-vous également au serveur de base de données et examinez les ports utilisés par l'instance dans SQL Server Configuration Manager (Configuration réseau SQL Server> Protocoles pour INSTANCENAME> TCP/IP> Propriétés> IPAll TCP Dynamic Ports) .

Les éléments suivants ont ensuite fonctionné:

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

Il s'agissait d'un problème avec le pilote ODBC Microsoft, qui a été corrigé avec Microsoft ODBC Driver 17.4

Avec la nouvelle version, les pilotes sqlcmd et sqlsrv pour php peuvent interroger le port UDP 1434 pour demander au serveur MSSQL le numéro de port de l'instance nommée

2
Catscrash

Mon utilisateur Windows n'était pas autorisé à exécuter netstat -abn comme suggéré dans la réponse de geographika, mais je pourrais contourner cela:

En utilisant tasklist | find /i "Ssms.exe", J'ai obtenu le résultat suivant:

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

14144 dans l'exemple ci-dessus est le PID. Ensuite, je suis entré netstat -oan | find /i "14144"

Cela retournera (probablement plus d'une ligne):

TCP    192.168.100.102:60348  192.168.100.102:55600  HERGESTELLT   14144

Le port auquel se connecter serait donc 55600.

Cette réponse m'a donné l'indice nécessaire, mais cela n'a pas fonctionné comme prévu, j'ai donc dû l'adapter un peu.

(EDIT: J'ai en quelque sorte oublié de tout mettre ensemble.)

Maintenant, nous pouvons nous connecter en utilisant sqlcmd l'IP et le port:

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