Wie kann ich installierte SQL Server-Instanzen und deren Versionen ermitteln?

224

Ich versuche festzustellen, welche Instanzen von SQL Server / SQL Express ich installiert habe (entweder manuell oder programmgesteuert), aber alle Beispiele fordern mich auf, eine SQL-Abfrage auszuführen, um festzustellen, ob ich bereits mit einer bestimmten Instanz verbunden bin .

Luke
quelle
1
Hier ist ein Link, wie man sich mit sqlcmd identifiziert. Msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx
So finden Sie Ihre SQL Server-Instanzen (
Servername
Können Sie mir die SQL-Abfragen mitteilen, von denen Sie sprechen?
LearnByReading
1
@LearnByReading Siehe die Antwort von Mohammed Ifteqar Ahmed unten.
Luke
2
Sie können die Registrierung abfragen
Paul Michaels

Antworten:

209

An einer Kommandozeile:

SQLCMD -L

oder

OSQL -L

(Hinweis: muss ein Großbuchstabe L sein)

Dadurch werden alle in Ihrem Netzwerk installierten SQL Server aufgelistet. Sie können Konfigurationsoptionen festlegen, um zu verhindern, dass ein SQL Server in der Liste angezeigt wird. Um dies zu tun...

An der Kommandozeile:

svrnetcn

Wählen Sie in der Liste der aktivierten Protokolle 'TCP / IP' aus und klicken Sie auf Eigenschaften. Es gibt ein Kontrollkästchen für "Server ausblenden".

George Mastros
quelle
2
Ich mag die Befehlszeilenoptionen, aber ich habe gemischte Ergebnisse erhalten, als ich sie auf meiner (nicht vernetzten) Entwicklerbox ausprobiert habe. Im Grunde war "sqlcmd -L" die einzige, die funktionierte, und nur, wenn der SQL Server-Browserdienst ausgeführt wurde. Ist das zu erwarten?
Matt
Ich liebe es, wenn es einfach und gerade ist. Ich hatte Probleme, den richtigen Servernamen für eine Amazon Web Service SQL Server-Instanz zu finden. ThanX
Mehdi LAMRANI
1
Nette Befehle, aber aus irgendeinem Grund wurde die SQLExpress-Instanz in einem berechneten Netzwerk erkannt, die SQLExpress-Instanz auf meinem lokalen Computer konnte jedoch nicht erkannt werden.
Ersatzbytes
1
@ Ersatzbytes: Grund hier: dba.stackexchange.com/questions/18499/…
DonBecker
Versuchen Sie:C:\> sqllocaldb i
Contango
82

Sie können diesen Registrierungswert abfragen, um die SQL-Version direkt abzurufen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup\CurrentVersion

Alternativ können Sie Ihren Instanznamen abfragen und dann sqlcmd mit Ihrem gewünschten Instanznamen verwenden:

So sehen Sie Ihren Instanznamen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names

Führen Sie dann Folgendes aus:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Wenn Sie C ++ verwenden, können Sie diesen Code verwenden, um die Registrierungsinformationen abzurufen.

Brian R. Bondy
quelle
('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') zeigen nur Server an, auf denen nur eine, aber keine Instanzen oder installierte, aber gestoppte Server ausgeführt werden
Gennady Vanin Геннадий Ванин
Danke, die Abfrage hat bei mir funktioniert. Ich hatte eine Maschine und wollte wissen, welche Standardinstanz und welche SQL Express-Instanz 2008 und welche 2008 R2 war. Ich habe mich mit jeder Instanz verbunden und die Abfrage ausgeführt, und ich habe eine Versionsnummer erhalten. Die Zahlen zu googeln war dann einfach.
Meligy
3
Beachten Sie, dass "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <Version> \ Tools \ ClientSetup \ CurrentVersion" und "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Instanznamen" im 32-Bit-Teil von angezeigt werden Registrierung, während der tatsächliche Pfad zur Instanz: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <Instanzname>" im 64-Bit-Hive angezeigt wird.
NGaida
Die Registrierung ist die Quelldefinition der installierten Software. Ihre Lösung ermöglicht es mir, direkt zur Quelle zu wechseln, anstatt ein CLI-Tool zu verwenden, das letztendlich Registrierungswerte verwendet, oder ein MMC-Snap-In, das auch die Registrierung verwendet. Perfekt
Barrypicker
76

Alle installierten Instanzen sollten im Services Snap-In in der Microsoft Management Console angezeigt werden. Um die Instanznamen abzurufen, gehen Sie zu Start | Führen Sie | aus Geben Sie Services.msc ein und suchen Sie nach allen Einträgen mit "SQL Server (Instanzname)".

dotnetengineer
quelle
13
Äquivalenter PowerShell-Befehl:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad
2
Mein Computer zeigt an, dass MSSQL $ SQLEXPRESS mit dem Anzeigenamen SQL Server (SQLEXPRESS) ausgeführt wird. Aber wie gebe ich dies in einen Servernamen ein? Testverbindung zeigt Fehler wie ... ein netzwerkbezogener oder instanzspezifischer Fehler ist aufgetreten, als versucht wurde, eine Verbindung zum SQL Server
herzustellen
47

- T-SQL-Abfrage, um eine Liste der auf einem Computer installierten Instanzen zu finden

DECLARE @GetInstances TABLE
( Value nvarchar(100),
 InstanceNames nvarchar(100),
 Data nvarchar(100))

Insert into @GetInstances
EXECUTE xp_regread
  @rootkey = 'HKEY_LOCAL_MACHINE',
  @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
  @value_name = 'InstalledInstances'

Select InstanceNames from @GetInstances 
Mohammed Ifteqar Ahmed
quelle
Gut! Ich denke nur, dass es erforderlich ist, eine Verbindung herzustellen, sanicht wahr?
JYZ
3
+1 Die Informationsquelle zu den Instanzen entspricht der Antwort von Brian. Jemand könnte genauso gut C # -Code schreiben, um den Wert aus der Windows-Registrierung abzurufen. was mich denken ließ, dass die Antwort für den Moment überflüssig ist, aber es ist schön, über xp_regread Bescheid zu wissen. #Vielen Dank.
Mzn
Die Abfrageergebnisse sind nur Instanznamen. Ist es möglich, den Ergebnissen eine Kompatibilitätsstufe für jede Instanz hinzuzufügen?
Marwan Almukh
16

Ich weiß, dass dieser Thread etwas alt ist, aber ich bin auf diesen Thread gestoßen, bevor ich die Antwort gefunden habe, nach der ich gesucht habe, und dachte, ich würde sie teilen. Wenn Sie SQLExpress (oder localdb) verwenden, gibt es eine einfachere Möglichkeit, Ihre Instanznamen zu finden. Geben Sie an einer Befehlszeile Folgendes ein:

> sqllocaldb i

Dadurch werden die Instanznamen aufgelistet, die Sie lokal installiert haben. Daher sollte Ihr vollständiger Servername (localdb) \ vor dem Instanznamen enthalten, um eine Verbindung herzustellen. Mit sqllocaldb können Sie außerdem neue Instanzen erstellen oder löschen sowie konfigurieren. Siehe: SqlLocalDB-Dienstprogramm .

John Denton
quelle
11

Wenn Sie nur sehen möchten, was auf dem Computer installiert ist, auf dem Sie gerade angemeldet sind, ist es meiner Meinung nach am einfachsten, einfach den SQL Server-Konfigurations-Manager (über das Startmenü) zu öffnen, in dem alle SQL-Dienste (und) angezeigt werden nur SQL-Dienste) auf dieser Hardware (ausgeführt oder nicht). Dies setzt SQL Server 2005 oder höher voraus. Die Empfehlung von dotnetengineer zur Verwendung der Services Management Console zeigt Ihnen alle Dienste an und sollte immer verfügbar sein (wenn Sie beispielsweise frühere Versionen von SQL Server ausführen ).

Wenn Sie jedoch nach einem umfassenderen Erkennungsprozess suchen, sollten Sie Tools von Drittanbietern wie SQLRecon und SQLPing in Betracht ziehen, die Ihr Netzwerk scannen und einen Bericht über alle SQL Service-Instanzen erstellen, die auf einem Server gefunden wurden, auf den sie Zugriff haben. Es ist schon eine Weile her, dass ich solche Tools verwendet habe, aber ich war überrascht, was sie fanden (nämlich eine Handvoll Fälle, von denen ich nicht wusste, dass sie existieren). YMMV. Sie könnten Google für Details, aber ich glaube, diese Seite hat die relevanten Downloads: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

Matt
quelle
1
SQL Server Configuration Manager war genau das, was ich brauchte. Schnell und einfach.
Chris
8

Mit SQL Server können Anwendungen SQL Server-Instanzen im aktuellen Netzwerk finden. Die SqlDataSourceEnumerator-Klasse stellt diese Informationen dem Anwendungsentwickler zur Verfügung und stellt eine DataTable bereit, die Informationen zu allen sichtbaren Servern enthält. Diese zurückgegebene Tabelle enthält eine Liste der im Netzwerk verfügbaren Serverinstanzen, die mit der Liste übereinstimmt, die beim Versuch eines Benutzers, eine neue Verbindung herzustellen, bereitgestellt wird, und erweitert die Dropdown-Liste mit allen verfügbaren Servern im Dialogfeld Verbindungseigenschaften. Die angezeigten Ergebnisse sind nicht immer vollständig. Um die Tabelle mit Informationen zu den verfügbaren SQL Server-Instanzen abzurufen, müssen Sie zuerst einen Enumerator mit der Eigenschaft shared / static Instance abrufen:

using System.Data.Sql;

class Program
{
  static void Main()
  {
    // Retrieve the enumerator instance and then the data.
    SqlDataSourceEnumerator instance =
      SqlDataSourceEnumerator.Instance;
    System.Data.DataTable table = instance.GetDataSources();

    // Display the contents of the table.
    DisplayData(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
  }

  private static void DisplayData(System.Data.DataTable table)
  {
    foreach (System.Data.DataRow row in table.Rows)
    {
      foreach (System.Data.DataColumn col in table.Columns)
      {
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
      }
      Console.WriteLine("============================");
    }
  }
}

von msdn http://msdn.microsoft.com/en-us/library/a6t1z9x2(v=vs.80).aspx

Ian
quelle
Muss ich ein Subnetz in dieser oder dieser Domäne angeben, das für mich null ist
Transformator
1
Für diejenigen, die .NET Core verwenden möchten, SqlDataSourceEnumeratorist es noch nicht implementiert, steht jedoch auf der Liste, die gemäß dem GitHub-Problem hinzugefügt werden soll .
Daniel Hill
5

SQL Server-Browserdienst http://msdn.microsoft.com/en-us/library/ms181087.aspx

Cade Roux
quelle
1
oops ... fehlt sqlbrowser.exe vom üblichen Ort! Ich muss die Microsoft Edition haben (dh die, die nicht funktioniert) :-) Scherz - wir alle lieben Microsoft, fast so sehr wie meine Schwiegermutter.
Sam
5

Wenn Sie dies in einem Skript ermitteln möchten, können Sie Folgendes versuchen:

sc \\server_name query | grep MSSQL

Hinweis: grep ist Teil der gnuwin32-Tools

Dale Sykora
quelle
3
Sie können findstrstattdessen grepdafür verwenden.
Pablo Montilla
Sie können auch FIND verwenden, was zur Abfrage sc \\ Servername | führt FINDEN SIE "MSSQL"
Julio Nobre
5

Geben Sie in der Windows-Befehlszeile Folgendes ein:

SC \\server_name query | find /I "SQL Server ("

Dabei ist "Servername" der Name eines Remote-Servers, auf dem Sie die SQL-Instanzen anzeigen möchten.

Dies erfordert natürlich genügend Berechtigungen.

Jimbo
quelle
Funktioniert nicht auf meinem Entwicklungscomputer, auf dem 2008 R2 und mehrere Express- und LocalDB-Instanzen ausgeführt werden.
Christoph
4

Diese Abfrage sollte Ihnen den Servernamen und den Instanznamen geben:

SELECT @@SERVERNAME, @@SERVICENAME
Anonym
quelle
3
Hier erfahren Sie nur den Namen der aktuellen Instanz, die der ausgeführten Abfrage zugeordnet ist. OP forderte eine Liste aller installierten Instanzen an
Jay Walker
1
Dies liefert keine Informationen darüber, welche Version von SQL Server installiert ist
Ahmad
2

Ich hatte das gleiche Problem. Der Befehl "osql -L" zeigte nur eine Liste von Servern an, jedoch ohne Instanznamen (nur die Instanz meines lokalen SQL-Servers wurde angezeigt). Mit Wireshark, sqlbrowser.exe (das sich im freigegebenen Ordner Ihrer SQL-Installation befindet), habe ich eine Lösung für mein Problem gefunden.

Die lokale Instanz wird durch einen Registrierungseintrag aufgelöst. Die Remote-Instanzen werden durch UDP-Broadcast (Port 1434) und SMB aufgelöst. Verwenden Sie "sqlbrowser.exe -c", um die Anforderungen aufzulisten.

Meine Konfiguration verwendet 1 physischen und 3 virtuellen Netzwerkadapter. Wenn ich den Befehl "osql -L" verwendet habe, hat der sqlbrowser anstelle des physischen eine Anforderung von einem der virtuellen Adapter (der sich in einem anderen Netzwerksegment befindet) angezeigt. osql wählt den Adpater anhand seiner Metrik aus. Sie können die Metrik mit dem Befehl "route print" sehen. Für meine Konfiguration zeigte die Routing-Tabelle eine niedrigere Metrik für den virtuellen Adapter als für den physischen. Daher habe ich die Schnittstellenmetrik in den Netzwerkeigenschaften geändert, indem ich die automatische Metrik in den erweiterten Netzwerkeinstellungen deaktiviert habe. osql verwendet jetzt den physischen Adapter.

Daniel
quelle
2

Eine weitere Option wäre, den SQLSERVER-Erkennungsbericht auszuführen. Gehen Sie zum Installationsmedium von sqlserver und doppelklicken Sie auf setup.exe

Geben Sie hier die Bildbeschreibung ein

Gehen Sie im nächsten Bildschirm zu Tools und klicken Sie wie unten gezeigt auf Erkennungsbericht

Geben Sie hier die Bildbeschreibung ein

Dies zeigt Ihnen alle vorhandenen Instanzen zusammen mit den gesamten Funktionen. Unten ist ein Schnappschuss auf meinem PC Geben Sie hier die Bildbeschreibung ein

TheGameiswar
quelle
1

Ich habe gerade SQL Server 2008 installiert, konnte aber keine Verbindung zu Datenbankinstanzen herstellen. Die Befehle @G Mastros haben keine aktiven Instanzen aufgelistet.

Also habe ich in den Diensten nachgesehen und festgestellt, dass der SQL Server-Agent deaktiviert war. Ich habe es behoben, indem ich es auf automatisch eingestellt und dann gestartet habe.

Moulde
quelle
1

Ich hatte das gleiche Problem, als ich mehr als 100 Server untersuchte. Ich hatte ein Skript in C # geschrieben, um die Dienstnamen zu durchsuchen, die aus SQL bestehen. Bei der Installation von Instanzen auf dem Server fügt SQL Server für jede Instanz einen Dienst mit dem Dienstnamen hinzu. Es kann für verschiedene Versionen wie 2000 bis 2008 variieren, aber es gibt sicher einen Dienst mit Instanznamen.

Ich nehme den Dienstnamen und erhalte den Instanznamen aus dem Dienstnamen. Hier ist der Beispielcode, der mit dem WMI-Abfrageergebnis verwendet wird:

if (ServiceData.DisplayName == "MSSQLSERVER" || ServiceData.DisplayName == "SQL Server (MSSQLSERVER)")
            {
                InstanceData.Name = "DEFAULT";
                InstanceData.ConnectionName = CurrentMachine.Name;
                CurrentMachine.ListOfInstances.Add(InstanceData);
            }
            else
                if (ServiceData.DisplayName.Contains("SQL Server (") == true)
                {
                    InstanceData.Name = ServiceData.DisplayName.Substring(
                                            ServiceData.DisplayName.IndexOf("(") + 1,
                                            ServiceData.DisplayName.IndexOf(")") - ServiceData.DisplayName.IndexOf("(") - 1
                                        );
                    InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                    CurrentMachine.ListOfInstances.Add(InstanceData);
                }
                else
                    if (ServiceData.DisplayName.Contains("MSSQL$") == true)
                    {
                        InstanceData.Name = ServiceData.DisplayName.Substring(
                                                ServiceData.DisplayName.IndexOf("$") + 1,
                                                ServiceData.DisplayName.Length - ServiceData.DisplayName.IndexOf("$") - 1
                                            );

                        InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                        CurrentMachine.ListOfInstances.Add(InstanceData);
                    }
AbuTaareq
quelle
0

Hier ist eine einfache Methode: Gehen Sie zu Start, dann zu Programmen, dann zu Microsoft SQL Server 2005, dann zu den Konfigurationstools, dann zu SQL Server Configuration Manager, dann zu SQL Server 2005, Netzwerkkonfiguration und dann zu Hier. Hier finden Sie alle auf Ihrem Computer installierten Instanzen.

Badar
quelle
0

Ich weiß, dass es ein alter Beitrag ist, aber ich habe mit PoweShell eine gute Lösung gefunden, bei der Sie SQL-Instanzen finden können, die auf einem lokalen oder einem Remotecomputer installiert sind, einschließlich der Version, und auch andere Eigenschaften erhalten können.

$MachineName = ‘.’ # Default local computer Replace . with server name for a remote computer

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $MachineName)
$regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL" )
$values = $regkey.GetValueNames()
$values | ForEach-Object {$value = $_ ; $inst = $regKey.GetValue($value); 
              $path = "SOFTWARE\\Microsoft\\Microsoft SQL Server\\"+$inst+"\\MSSQLServer\\"+"CurrentVersion";
              #write-host $path; 
              $version = $reg.OpenSubKey($path).GetValue("CurrentVersion");
                          write-host "Instance" $value;
              write-host  "Version" $version}
Akhila Vangala
quelle
hallo das ist großartig , wie kann ich diese wickeln in einer C # -Klasse oder , wie dies rufen von Code
Transformator
Hallo. Dies ist mein erster Versuch mit Powershell, daher wäre Ihre Hilfe dankbar. Ich erhalte die folgende Fehlermeldung, wenn ich versuche, dieses Skript auszuführen. Aldo wird dies alle Remote-SQL-Server finden? Ich versuche, eine Liste der SQL Server und ihrer Datenbanken zu erstellen. Sie können keine Methode für einen Ausdruck mit Nullwert aufrufen. + $ values ​​= $ regkey.GetValueNames ()
Darryl Wilson
0

Die Befehle OSQL -Lund SQLCMD -Lzeigen Ihnen alle Instanzen im Netzwerk .

Wenn Sie eine Liste aller Instanzen auf dem Server haben möchten und keine Lust auf Skripterstellung oder Programmierung haben, gehen Sie folgendermaßen vor:

  1. Starten Sie den Windows Task-Manager
  2. Aktivieren Sie das Kontrollkästchen "Prozesse von allen Benutzern anzeigen" oder ein gleichwertiges Kontrollkästchen
  3. Sortieren Sie die Prozesse nach "Bildname"
  4. Suchen Sie alle sqlsrvr.exeBilder

Die Instanzen sollten in der Spalte "Benutzername" als aufgeführt sein MSSQL$INSTANCE_NAME.

Und ich ging davon aus, dass auf dem armen Server 63 Instanzen ausgeführt wurden, und stellte fest, dass drei ausgeführt wurden (von denen sich eine mit der CPU-Auslastung wie ein totaler Mobber verhielt ...).

Erk
quelle
0

Ruft die Instanzen der SQL Server-Registrierungsabfrage "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instanznamen \ SQL" ab.

oder Verwenden Sie SQLCMD -L

Siva
quelle
-1

Wenn Sie sich in SSMS befinden, ist die Verwendung möglicherweise einfacher:

SELECT @@Version
Craig
quelle
3
Die Frage selbst besagt, dass sie keine SQL-Abfragen verwenden möchten / können, um die Version zu bestimmen
Trotski94