Jak mogę ustalić zainstalowane instancje SQL Server i ich wersje?

224

Próbuję ustalić, które instancje serwera SQL Express / SQL Express zostały zainstalowane (ręcznie lub programowo), ale wszystkie przykłady każą mi uruchomić zapytanie SQL w celu ustalenia, która zakłada, że ​​jestem już połączona z konkretną instancją .

Łukasz
źródło
1
Oto link, jak identyfikować się z sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx
Jak znaleźć wystąpienia programu SQL Server (nazwa serwera) i wersje youtube.com/watch?v=DLrxFXXeLFk
mloskot
czy możesz mi powiedzieć o zapytaniach SQL, o których mówisz?
LearnByReading
1
@LearnByReading Patrz odpowiedź Mohammeda Ifteqara Ahmeda poniżej.
Łukasz
2
Możesz przesłuchać rejestr: pmichaels.net/2016/02/12/…
Paul Michaels

Odpowiedzi:

209

W wierszu polecenia:

SQLCMD -L

lub

OSQL -L

(Uwaga: musi być dużą literą L)

Spowoduje to wyświetlenie listy wszystkich serwerów SQL zainstalowanych w sieci. Istnieją opcje konfiguracji, które można ustawić, aby SQL Server nie pojawiał się na liście. Aby to zrobić ...

W wierszu polecenia:

svrnetcn

Na liście włączonych protokołów wybierz „TCP / IP”, a następnie kliknij właściwości. Pole wyboru „Ukryj serwer” jest zaznaczone.

George Mastros
źródło
2
Lubię opcje wiersza polecenia, ale otrzymałem mieszane wyniki, gdy wypróbowałem je na moim (nie podłączonym do sieci) oknie programisty; w zasadzie „sqlcmd -L” był jedynym, który działał i tylko wtedy, gdy uruchomiona była usługa przeglądarki SQL Server. Czy tego należy się spodziewać?
Matt
UWIELBIAM to, kiedy jest PROSTA i PROSTA. Próbowałem znaleźć właściwą nazwę serwera, aby wprowadzić dla instancji SQL Server Amazon Web Service. Dzięki
Mehdi LAMRANI
1
Ładne polecenia, ale z jakiegoś powodu wykryło wystąpienie SQLExpress w sieci, ale nie udało się wykryć wystąpienia SQLExpress na moim komputerze lokalnym.
sparebytes
1
@sparebytes: powód tutaj: dba.stackexchange.com/questions/18499/…
DonBecker
Spróbuj:C:\> sqllocaldb i
Contango,
82

Możesz zapytać o tę wartość rejestru, aby uzyskać wersję SQL bezpośrednio:

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

Alternatywnie możesz zapytać o nazwę instancji, a następnie użyć narzędzia sqlcmd z nazwą instancji, którą chcesz:

Aby zobaczyć nazwę instancji:

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

Następnie wykonaj to:

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

Jeśli używasz C ++, możesz użyć tego kodu, aby uzyskać informacje o rejestrze.

Brian R. Bondy
źródło
(„wersja produktu”), SERVERPROPERTY („poziom produktu”), SERVERPROPERTY („edycja”) pokazuje tylko serwer, na którym działa tylko jedna instancja lub nie ma zainstalowanych, ale zatrzymanych serwerów
Gennady Vanin Геннадий Ванин
Dzięki, zapytanie zadziałało dla mnie. Miałem maszynę i chciałem poznać domyślną instancję i instancję SQL Express, która była 2008, a która 2008 R2. Połączyłem się z każdą instancją i uruchomiłem zapytanie, dzięki czemu otrzymałem numer wersji. Googlowanie liczb było wtedy łatwe.
Meligy
3
Uwaga: wygląda na to, że „HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <wersja> \ Tools \ ClientSetup \ CurrentVersion” i „HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Nazwy wystąpień” pojawia się w 32-bitowej części rejestru, podczas gdy rzeczywista ścieżka do instancji: „HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>” pojawia się w 64-bitowym gałęzi.
NGaida,
Rejestr jest źródłową definicją zainstalowanego oprogramowania. Twoje rozwiązanie pozwala mi przejść bezpośrednio do źródła, zamiast używać narzędzia CLI, które ostatecznie korzysta z wartości rejestru lub przystawki MMC, która również korzysta z rejestru. Idealne
barrypicker
76

Wszystkie zainstalowane instancje powinny pojawić się w przystawce Usługi w konsoli Microsoft Management Console. Aby uzyskać nazwy instancji, przejdź do Start | Uruchom | wpisz Services.msc i poszukaj wszystkich wpisów za pomocą „Sql Server (nazwa instancji)”.

dotnetengineer
źródło
13
Równoważne polecenie PowerShell:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad
2
Mój komputer pokazuje, że MSSQL $ SQLEXPRESS działa z wyświetlaną nazwą SQL Server (SQLEXPRESS) .... ale jak mogę to wpisać w nazwie serwera? Połączenie testowe pokazuje błędy takie jak ... błąd związany z siecią lub wystąpienie specyficzne dla wystąpienia podczas próby połączenia się z serwerem sql
webzy
47

- Zapytanie T-SQL, aby znaleźć listę instancji zainstalowanych na komputerze

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
źródło
Dobry! Po prostu myślę, że trzeba się połączyć, saprawda?
maja12
3
+1 Źródło informacji o instancjach jest takie samo jak odpowiedź Briana. Ktoś może równie dobrze napisać kod C #, aby uzyskać wartość z rejestru systemu Windows; co sprawiło, że pomyślałem, że odpowiedź jest na chwilę zbędna, ale miło jest wiedzieć o xp_regread. #dzięki.
Mzn
Wyniki zapytania to tylko nazwy instancji. Czy można dodać poziom zgodności dla każdej instancji do wyników?
Marwan Almukh
16

Wiem, że ten wątek jest trochę stary, ale natknąłem się na ten wątek, zanim znalazłem odpowiedź, której szukałem, i pomyślałem, że się podzielę. Jeśli używasz SQLExpress (lub localdb), istnieje prostszy sposób na znalezienie nazw instancji. W wierszu polecenia wpisz:

> sqllocaldb i

Spowoduje to wyświetlenie nazw instancji zainstalowanych lokalnie. Dlatego pełna nazwa serwera powinna zawierać (localdb) \ przed nazwą instancji, aby się połączyć. Ponadto sqllocaldb pozwala tworzyć nowe wystąpienia lub usuwać je, a także konfigurować. Zobacz: Narzędzie SqlLocalDB .

John Denton
źródło
11

Jeśli chcesz tylko zobaczyć, co jest zainstalowane na komputerze, na którym jesteś aktualnie zalogowany, myślę, że najprostszym ręcznym procesem jest po prostu otwarcie programu SQL Server Configuration Manager (z menu Start), który wyświetla wszystkie usługi SQL (i tylko usługi SQL) na tym sprzęcie (uruchomionym lub nie). Zakłada się, że SQL Server 2005 lub nowszy; Zalecenie dotnetengineer dotyczące korzystania z konsoli zarządzania usługami pokaże wszystkie usługi i powinno być zawsze dostępne (na przykład w przypadku wcześniejszych wersji programu SQL Server).

Jeśli szukasz szerszego procesu wykrywania, możesz jednak rozważyć narzędzia innych firm, takie jak SQLRecon i SQLPing, które skanują sieć i tworzą raport o wszystkich wystąpieniach usługi SQL znalezionych na dowolnym serwerze, do którego mają dostęp. Minęło trochę czasu, odkąd użyłem takich narzędzi, ale byłem zaskoczony tym, co znaleźli (a mianowicie garstką przypadków, o których istnieniu nie wiedziałem). YMMV. Możesz uzyskać szczegółowe informacje od Google, ale uważam, że ta strona ma odpowiednie pliki do pobrania: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

Matt
źródło
1
SQL Server Configuration Manager był dokładnie tym, czego potrzebowałem. Szybko i łatwo.
Chris
8

SQL Server pozwala aplikacjom na wyszukiwanie wystąpień SQL Server w bieżącej sieci. Klasa SqlDataSourceEnumerator udostępnia te informacje twórcy aplikacji, udostępniając tabelę danych zawierającą informacje o wszystkich widocznych serwerach. Ta zwrócona tabela zawiera listę instancji serwera dostępnych w sieci, która jest zgodna z listą podaną, gdy użytkownik próbuje utworzyć nowe połączenie, i rozwija listę rozwijaną zawierającą wszystkie dostępne serwery w oknie dialogowym Właściwości połączenia. Wyświetlane wyniki nie zawsze są kompletne. Aby pobrać tabelę zawierającą informacje o dostępnych instancjach SQL Server, musisz najpierw pobrać moduł wyliczający, używając właściwości Shared / static Instance:

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("============================");
    }
  }
}

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

Ian
źródło
czy muszę określić podsieć w tej domenie lub domenie, dla mnie wartość ta jest zerowa, czy możesz zaktualizować
transformator
1
Dla tych, którzy chcą korzystać z .NET Core, SqlDataSourceEnumeratornie jest jeszcze zaimplementowany, ale znajduje się na liście do dodania zgodnie z problemem GitHub .
Daniel Hill
5

Usługa przeglądarki SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

Cade Roux
źródło
1
oops ... brakuje pliku sqlbrowser.exe ze zwykłej lokalizacji! Muszę mieć wersję Microsoft (tj. Tę, która nie działa) :-) Żartuję - wszyscy kochamy Microsoft, prawie tak samo jak moja teściowa.
Sam
5

Jeśli chcesz to ustalić w skrypcie, możesz spróbować:

sc \\server_name query | grep MSSQL

Uwaga: grep jest częścią narzędzi gnuwin32

Dale Sykora
źródło
3
Możesz użyć findstrzamiast greptego.
Pablo Montilla
Możesz także użyć ZNAJDŹ, co prowadzi do zapytania sc \\ nazwa_serwera | ZNAJDŹ „MSSQL”
Julio Nobre
5

W wierszu polecenia systemu Windows wpisz:

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

Gdzie „nazwa_serwera” to nazwa dowolnego zdalnego serwera, na którym chcesz wyświetlić instancje SQL.

Wymaga to oczywiście wystarczających uprawnień.

jimbo
źródło
Nie działa na moim komputerze deweloperskim, który ma 2008 R2 i działa wiele instancji Express i LocalDB.
Christoph
4

To zapytanie powinno uzyskać nazwę serwera i nazwę instancji:

SELECT @@SERVERNAME, @@SERVICENAME
Anonimowy
źródło
3
Podaje tylko nazwę bieżącej instancji powiązanej z wykonanym zapytaniem. OP poprosił o listę wszystkich zainstalowanych instancji
Jay Walker
1
Nie zawiera żadnych informacji o tym, która wersja serwera SQL jest zainstalowana
Ahmad
2

Miałem ten sam problem. Komenda „osql -L” wyświetlała tylko listę serwerów, ale bez nazw instancji (wyświetlana była tylko instancja mojego lokalnego serwera SQL). Dzięki Wireshark, sqlbrowser.exe (który można znaleźć w folderze współdzielonym instalacji SQL) znalazłem rozwiązanie mojego problemu.

Lokalne wystąpienie jest rozwiązywane przez wpis rejestru. Zdalne instancje są rozwiązywane przez transmisję UDP (port 1434) i SMB. Użyj „sqlbrowser.exe -c”, aby wyświetlić listę żądań.

Moja konfiguracja wykorzystuje 1 fizyczną i 3 wirtualne karty sieciowe. Gdybym użył polecenia „osql -L”, program sqlbrowser wyświetlił żądanie z jednego z wirtualnych adapterów (znajdujących się w innym segmencie sieci) zamiast fizycznego. osql wybiera adpatera na podstawie jego metryki. Możesz zobaczyć metrykę z poleceniem „wydruk trasy”. Dla mojej konfiguracji tabela routingu pokazała niższą metrykę dla wirtualnego adaptera niż dla fizycznej. Zmieniłem więc metrykę interfejsu we właściwościach sieci, odznaczając automatyczną metrykę w zaawansowanych ustawieniach sieci. osql używa teraz adaptera fizycznego.

Daniel
źródło
2

Jeszcze jedną opcją byłoby uruchomienie raportu wykrywania SQLSERVER .. przejdź do nośnika instalacyjnego serwera sqlserver i kliknij dwukrotnie plik setup.exe

wprowadź opis zdjęcia tutaj

a na następnym ekranie przejdź do narzędzi i kliknij raport wykrywania, jak pokazano poniżej

wprowadź opis zdjęcia tutaj

Spowoduje to wyświetlenie wszystkich wystąpień wraz z wszystkimi funkcjami. Poniżej znajduje się migawka na moim komputerze wprowadź opis zdjęcia tutaj

TheGameiswar
źródło
1

Właśnie zainstalowałem Sql server 2008, ale nie mogłem połączyć się z żadnymi instancjami bazy danych. Polecenia opublikowane przez @G Mastros nie zawierają aktywnych instancji.

Poszukałem usług i stwierdziłem, że agent serwera SQL został wyłączony. Naprawiłem go, ustawiając go na automatyczny, a następnie uruchamiając.

Moulde
źródło
1

Miałem ten sam problem podczas oceny ponad 100 serwerów, miałem skrypt napisany w języku C # do przeglądania nazw usług składających się z SQL. Gdy instancje są instalowane na serwerze, SQL Server dodaje usługę dla każdej instancji o nazwie usługi. Może być różny dla różnych wersji, takich jak 2000–2008, ale na pewno istnieje usługa o nazwie instancji.

Biorę nazwę usługi i uzyskuję nazwę instancji z nazwy usługi. Oto przykładowy kod użyty z wynikiem zapytania WMI:

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
źródło
0

Oto prosta metoda: przejdź do Start, następnie Programy, następnie Microsoft SQL Server 2005, a następnie Narzędzia konfiguracyjne, a następnie SQL Server Menedżer konfiguracji, a następnie Konfiguracja sieci SQL Server 2005, a następnie Tutaj możesz zlokalizować wszystkie instancje zainstalowane na twoim komputerze.

Badar
źródło
0

Wiem, że to stary post, ale znalazłem fajne rozwiązanie z PoweShell, w którym można znaleźć instancje SQL zainstalowane na komputerze lokalnym lub zdalnym, w tym wersję, a także rozszerzyć uzyskać inne właściwości.

$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
źródło
cześć, to wspaniale, jak mogę zawinąć to w klasę C # lub jak wywołać to z kodu
transformator
Cześć. To moja pierwsza próba w PowerShell, więc Twoja pomoc będzie mile widziana. Podczas próby uruchomienia tego skryptu pojawia się następujący błąd. Aldo to znajdzie wszystkie zdalne serwery SQL? Próbuję skompilować listę serwerów SQL i ich baz danych. Nie można wywołać metody dla wyrażenia o wartości zerowej. + $ wartości = $ regkey.GetValueNames ()
Darryl Wilson
0

Polecenia OSQL -Li SQLCMD -Lpokażą wszystkie wystąpienia w sieci .

Jeśli chcesz mieć listę wszystkich instancji na serwerze i nie masz ochoty na wykonywanie skryptów lub programowania, wykonaj następujące czynności:

  1. Uruchom Menedżera zadań Windows
  2. Zaznacz pole wyboru „Pokaż procesy wszystkich użytkowników” lub równoważne
  3. Sortuj procesy według „Nazwy obrazu”
  4. Znajdź wszystkie sqlsrvr.exeobrazy

Instancje powinny być wymienione w kolumnie „Nazwa użytkownika” jako MSSQL$INSTANCE_NAME.

I zacząłem myśleć, że słaby serwer działał w 63 instancjach, i zdałem sobie sprawę, że działało trzy (z których jeden zachowywał się jak totalny tyran z obciążeniem procesora ...)

Erk
źródło
0

Otrzyma instancje zapytania o rejestr serwera SQL „HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Nazwy wystąpień \ SQL”

lub Użyj SQLCMD -L

siva
źródło
-1

Jeśli korzystasz z SSMS, możesz łatwiej użyć:

SELECT @@Version
Craig
źródło
3
Samo pytanie mówi, że nie chcą / nie mogą używać zapytań SQL do ustalenia wersji
Trotski94,