Sdílet prostřednictvím


Aktuelle Serverliste mit SQLCMD ermitteln

Wer kennt diese Situation nicht: Der Chef kommt unvermittelt ins Büro und verlangt eine aktuelle Liste aller installierten SQL Server.

Unangenehm sind nachfolgende Antworten:

  • „Die Excel-Liste ist leider nicht auf dem aktuellen Stand.“
  • „Wir setzen zwar den System Center Configuration Manager ein. Aber leider wird der Client nicht automatisch ausgerollt. Deshalb muss ich zuerst überprüfen, ob der Client überall installiert ist.“

Die beste Antwort ist in diesem Fall: „Moment. Die aktuelle Serverliste kommt sofort!“
Jetzt benötigen wir nur noch einen Einzeiler, der alle SQL Server auflistet:

 SQLCMD -L

Fertig.

Was passiert hier genau?

Eigentlich das gleiche, wie wenn wir im SQL Server Management Studio auf „Browse for Servers“ gehen und den Reiter „Network Servers“ auswählen.

image

Im Hintergrund wird ein UDP Broadcast an den Port 1434 (SQL Server Monitor – ms-sql-m) gesendet. Darauf geben alle SQL Server unter anderem den Instanznamen, die Versionsnummer, und die Kontaktdaten (im Falle von TCP die Portnummer) aller installierter Instanzen zurück. Außerdem wird die Information übermittelt, ob die jeweilige Instanz geclustert ist.

Wann funktioniert diese Lösung nicht?

Es gibt einige Fälle, in denen die Auflistung der SQL Server nicht funktioniert. In diesen Fällen funktioniert weder die „Browse for Servers“-Methode noch die SQLCMD-Methode.

Zu diesen Fällen gehören folgende:

  • Der SQL Server Browser Dienst könnte deaktiviert oder einfach nicht gestartet sein
  • Der UDP Port 1434 könnte durch eine Firewall blockiert werden
  • Im Configuration Manager könnte das HideInstance Flag gesetzt worden sein

image

Erweiterte Nutzung von SQLCMD –Lc

Zusätzlich kann SQLCMD zum Beispiel nützlich sein, um SQL Server Information von allen Servern in der Server-Umgebung abzufragen. Durch die Erweiterung des Befehls mit dem Parameter c werden Überschrift und überflüssige Leerzeichen unterdrückt. Somit kann der Befehl auch als Eingabeliste für globale SQL Abfragen verwendet werden.

In folgendem Beispiel werden alle verwendeten SQL Server Versionen aufgelistet.

 FOR /F %s IN ('sqlcmd -Lc') DO SQLCMD -S %s -E -l 5 -r0 -h-1 -s"," -W -Q _
"SET NOCOUNT ON; SELECT @@SERVERNAME, SERVERPROPERTY('ProductVersion')" _
>> C:\Temp\ServerListe.csv

Durch das “FOR /F” Konstrukt können alle ermittelten SQL Server als Eingabe für die SQL Abfrage verwendet werden.

Im nächsten Beispiel wird eine SQL-Datei als Eingabe für die Abfrage der SQL Server Informationen verwendet. In diesem Beispiel wird eine CMD-Datei verwendet. Zu beachten ist, dass innerhalb der CMD-Datei die Prozentzeichen verdoppelt werden müssen.

 FOR /F %%s IN ('sqlcmd -Lc') DO SQLCMD -S %%s -E -l 5 -r0 -h-1 -s"," _
-W -i C:\Temp\ServerListe.SQL >> C:\Temp\ServerListe.csv

Die SQL-Datei sollte mit dem Befehl SET NOCOUNT ON starten, um eine saubere Ausgabe zu erhalten.

Alle Server auf dem aktuellen Stand halten

Mit SQLCMD können natürlich nicht nur Informationen abgefragt werden. Ein weiterer interessanter Einsatz wäre alle SQL Server in der Umgebung auf den aktuellen Stand zu bringen. Sollten Sie auf allen SQL Servern Standard-Prozeduren im Einsatz haben, können diese einfach auf alle Server verteilt werden.

Ebenfalls lassen sich so individuelle Maintenance Jobs auf allen Server installieren bzw. aktualisieren. Und wenn einige Skripte parametrisiert zum Einsatz kommen sollen, bietet SQLCMD auch noch die Möglichkeit mit dem Parameter v Variablen für die Übergabe zu definieren.

Quellen:

https://msdn.microsoft.com/en-us/library/ms181087.aspx
https://msdn.microsoft.com/en-us/library/ms188200.aspx
https://msdn.microsoft.com/de-de/library/ms162773.aspx