Come posso determinare le istanze di SQL Server installate e le loro versioni?


224

Sto cercando di determinare quali istanze di sql server / sql express ho installato (manualmente o a livello di codice) ma tutti gli esempi mi dicono di eseguire una query SQL per determinare ciò che presume che io sia già connesso a una particolare istanza .


1
Ecco un link come identificare con sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx

Come trovare le istanze di SQL Server (nome server) e le versioni youtube.com/watch?v=DLrxFXXeLFk
mloskot

puoi dirmi le query SQL di cui stai parlando?
LearnByLeggi del

1
@LearnByReading Vedi di seguito la risposta di Mohammed Ifteqar Ahmed.
Luca,

2
Puoi interrogare il registro: pmichaels.net/2016/02/12/…
Paul Michaels,

Risposte:


209

Alla riga di comando:

SQLCMD -L

o

OSQL -L

(Nota: deve essere una L maiuscola)

Questo elencherà tutti i server sql installati sulla tua rete. Esistono opzioni di configurazione che è possibile impostare per impedire a un server SQL di essere visualizzato nell'elenco. Per fare questo...

Alla riga di comando:

svrnetcn

Nell'elenco dei protocolli abilitati, selezionare "TCP / IP", quindi fare clic su Proprietà. C'è una casella di controllo per "Nascondi server".


2
Mi piacciono le opzioni della riga di comando, ma ho ottenuto risultati contrastanti quando le ho provate sulla mia casella dello sviluppatore (non in rete); fondamentalmente "sqlcmd -L" era l'unico che funzionava e solo se il servizio browser SQL Server era in esecuzione. È prevedibile?
Matt,

Lo adoro quando è SEMPLICE e DIRITTO. Avevo difficoltà a trovare il nome del server giusto da inserire per un'istanza di SQL Server di Amazon Web Service. Grazie
Mehdi LAMRANI

1
Bei comandi ma per qualche motivo ha rilevato l'istanza SQLExpress su una rete calcolata ma non è riuscita a rilevare l'istanza SQLExpress sul mio computer locale.
sparebytes


Prova:C:\> sqllocaldb i
Contango

82

È possibile eseguire una query su questo valore di registro per ottenere direttamente la versione SQL:

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

In alternativa è possibile eseguire una query sul nome dell'istanza e quindi utilizzare sqlcmd con il nome dell'istanza che si desidera:

Per vedere il nome della tua istanza:

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

Quindi eseguire questo:

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

Se si utilizza C ++, è possibile utilizzare questo codice per ottenere le informazioni sul registro.


('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') mostra solo server, eseguendo solo uno ma non istanze o installato ma arrestato server
Gennady Vanin Геннадий Ванин

Grazie, la domanda ha funzionato per me. Avevo una macchina e volevo conoscere l'istanza predefinita e l'istanza di SQL Express che era il 2008 e quale il 2008 R2. Mi sono connesso a ciascuna istanza ed ho eseguito la query e mi ha fornito un numero di versione. Cercare su Google i numeri è stato facile.
Meligy,

3
Si noti che "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <versione> \ Tools \ ClientSetup \ CurrentVersion" e "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Nomi istanza" vengono visualizzati nella parte a 32 bit della sezione Registro di sistema, mentre il percorso effettivo dell'istanza: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <nomestato>" viene visualizzato nell'hive a 64 bit.
NGaida,

Il registro è la definizione di origine del software installato. La tua soluzione mi permette di andare direttamente alla fonte, piuttosto che utilizzare uno strumento CLI, che alla fine utilizza valori di registro o snap-in MMC che utilizza anche il registro. Perfetto
barrypicker il

76

Tutte le istanze installate devono essere visualizzate nello snap-in Servizi nella Microsoft Management Console. Per ottenere i nomi delle istanze, vai su Start | Esegui | digitare Services.msc e cercare tutte le voci con "Sql Server (Nome istanza)".


13
Comando equivalente di PowerShell:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad

2
Il mio computer mostra MSSQL $ SQLEXPRESS è in esecuzione con il nome visualizzato SQL Server (SQLEXPRESS) .... ma come posso inserirlo nel nome di un server? La connessione di prova mostra errori come ... si è verificato un errore relativo alla rete o specifico dell'istanza durante il tentativo di connessione al server sql
webzy

47

- Query T-SQL per trovare l'elenco di istanze installate su una macchina

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 

Buona! Penso solo che sia necessario connettersi come sanon è vero?
jyz,

3
+1 La fonte delle informazioni sulle istanze è la stessa della risposta di Brian. Qualcuno potrebbe anche scrivere il codice C # per ottenere il valore dal registro di Windows; che mi ha fatto pensare che la risposta sia ridondante per il momento, ma è bello sapere di xp_regread. #Grazie.
Mzn,

I risultati della query sono solo nomi di istanza. È possibile aggiungere un livello di compatibilità per ogni istanza ai risultati?
Marwan Almukh,

16

So che questo thread è un po 'vecchio, ma mi sono imbattuto in questo thread prima di trovare la risposta che stavo cercando e ho pensato di condividere. Se stai usando SQLExpress (o localdb) c'è un modo più semplice per trovare i nomi delle tue istanze. A una riga di comando digitare:

> sqllocaldb i

Verranno elencati i nomi delle istanze installati localmente. Quindi il tuo nome completo del server dovrebbe includere (localdb) \ davanti al nome dell'istanza per connetterti. Inoltre, sqllocaldb consente di creare nuove istanze o eliminarle e configurarle. Vedi: Utilità SqlLocalDB .


11

Se vuoi solo vedere cosa è installato sul computer a cui sei attualmente connesso, penso che il processo manuale più semplice sia aprire semplicemente Gestione configurazione SQL Server (dal menu Start), che mostra tutti i servizi SQL (e solo servizi SQL) su quell'hardware (in esecuzione o meno). Ciò presuppone che SQL Server 2005 o versione successiva; La raccomandazione di dotnetengineer di utilizzare la console di gestione dei servizi mostrerà tutti i servizi e dovrebbe essere sempre disponibile (ad esempio se si utilizzano versioni precedenti di SQL Server).

Se stai cercando un processo di rilevamento più ampio, tuttavia, potresti prendere in considerazione strumenti di terze parti come SQLRecon e SQLPing, che eseguiranno la scansione della tua rete e creeranno un rapporto di tutte le istanze del servizio SQL trovate su qualsiasi server a cui hanno accesso. È da un po 'che non uso strumenti come questo, ma sono rimasto sorpreso da ciò che hanno scoperto (vale a dire, una manciata di casi che non sapevo esistessero). YMMV. Potresti Google per i dettagli, ma credo che questa pagina abbia i download rilevanti: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx


1
Gestione configurazione SQL Server era esattamente ciò di cui avevo bisogno. Facile e veloce.
Chris

8

SQL Server consente alle applicazioni di trovare istanze di SQL Server all'interno della rete corrente. La classe SqlDataSourceEnumerator espone queste informazioni allo sviluppatore dell'applicazione, fornendo una DataTable contenente informazioni su tutti i server visibili. Questa tabella restituita contiene un elenco di istanze del server disponibili sulla rete che corrisponde all'elenco fornito quando un utente tenta di creare una nuova connessione ed espande l'elenco a discesa contenente tutti i server disponibili nella finestra di dialogo Proprietà connessione. I risultati visualizzati non sono sempre completi. Per recuperare la tabella contenente informazioni sulle istanze disponibili di SQL Server, è necessario innanzitutto recuperare un enumeratore, utilizzando la proprietà Instance condivisa / statica:

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

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


devo specificare una sottorete su questo o dominio, il suo ritorno è nullo per me, puoi aggiornare
trasformatore

1
Per coloro che desiderano utilizzare .NET Core, SqlDataSourceEnumeratornon è ancora implementato, ma è nell'elenco da aggiungere in base al problema di GitHub .
Daniel Hill,


5

Se sei interessato a determinarlo in uno script, puoi provare quanto segue:

sc \\server_name query | grep MSSQL

Nota: grep fa parte degli strumenti gnuwin32


3
È possibile utilizzare al findstrposto di grepper questo.
Pablo Montilla,

È inoltre possibile utilizzare, FIND, che porta alla query sc \\ nome_server | TROVA "MSSQL"
Julio Nobre,

5

Dalla riga di comando di Windows, digitare:

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

Dove "nome_server" è il nome di qualsiasi server remoto su cui si desidera visualizzare le istanze SQL.

Ciò richiede ovviamente sufficienti autorizzazioni.


Non funziona sulla mia macchina di sviluppo, che ha 2008 R2 e più istanze Express e LocalDB in esecuzione.
Christoph,

4

Questa query dovrebbe ottenere il nome del server e il nome dell'istanza:

SELECT @@SERVERNAME, @@SERVICENAME

3
Questo indica solo il nome dell'istanza corrente associata alla query in esecuzione. OP ha richiesto un elenco di tutte le istanze installate
Jay Walker,

1
Questo non fornisce alcuna informazione su quale versione del server SQL è installata
Ahmad

2

Ho avuto lo stesso problema. Il comando "osql -L" ha visualizzato solo un elenco di server ma senza nomi di istanza (è stata visualizzata solo l'istanza del mio server SQL locale). Con Wireshark, sqlbrowser.exe (che può essere trovato nella cartella condivisa dell'installazione SQL) ho trovato una soluzione al mio problema.

L'istanza locale viene risolta dalla voce di registro. Le istanze remote vengono risolte dalla trasmissione UDP (porta 1434) e SMB. Utilizzare "sqlbrowser.exe -c" per elencare le richieste.

La mia configurazione utilizza 1 adattatori di rete fisici e 3 virtuali. Se avessi usato il comando "osql -L", sqlbrowser avrebbe visualizzato una richiesta da uno degli adattatori virtuali (che si trova in un altro segmento di rete), anziché quello fisico. osql seleziona l'adattatore in base alla sua metrica. È possibile visualizzare la metrica con il comando "route route". Per la mia configurazione, la tabella di routing mostrava una metrica inferiore per l'adattatore virtuale quindi per quello fisico. Quindi ho modificato la metrica dell'interfaccia nelle proprietà della rete deselezionando la metrica automatica nelle impostazioni di rete avanzate. osql ora utilizza l'adattatore fisico.


2

Un'altra opzione sarebbe quella di eseguire il report di rilevamento di SQLSERVER ... passare al supporto di installazione di sqlserver e fare doppio clic su setup.exe

inserisci qui la descrizione dell'immagine

e nella schermata successiva, vai agli strumenti e fai clic sul rapporto di scoperta come mostrato di seguito

inserisci qui la descrizione dell'immagine

Questo ti mostrerà tutte le istanze presenti insieme a intere funzionalità ... sotto è un'istantanea sul mio pc inserisci qui la descrizione dell'immagine


1

Ho appena installato SQL Server 2008, ma non sono riuscito a collegarmi a nessuna istanza di database. I comandi @G Mastros pubblicati non hanno elencato istanze attive.

Quindi ho cercato i servizi e ho scoperto che l'agente del server SQL era disabilitato. L'ho risolto impostandolo su automatico e quindi avviandolo.


1

Ho avuto lo stesso problema durante la valutazione di oltre 100 server, avevo uno script scritto in C # per sfogliare i nomi dei servizi costituiti da SQL. Quando le istanze sono installate sul server, SQL Server aggiunge un servizio per ogni istanza con il nome del servizio. Può variare per diverse versioni come 2000-2008 ma sicuramente esiste un servizio con nome di istanza.

Prendo il nome del servizio e ottengo il nome dell'istanza dal nome del servizio. Ecco il codice di esempio utilizzato con il risultato della query 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);
                    }

0

Ecco un metodo semplice: vai su Start, quindi su Programmi, quindi su Microsoft SQL Server 2005, quindi su Strumenti di configurazione, quindi su Gestione configurazione SQL Server, quindi su Configurazione di rete di SQL Server 2005 e qui puoi individuare tutte le istanze installate sul tuo computer.


0

So che è un vecchio post, ma ho trovato una bella soluzione con PoweShell in cui puoi trovare istanze SQL installate su una macchina locale o remota inclusa la versione ed essere estesa per ottenere altre proprietà.

$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}

ciao, è fantastico come posso racchiuderlo in una classe C # o come chiamarlo dal codice
trasformatore

Ciao. Questo è il mio primo tentativo di PowerShell, quindi il tuo aiuto sarebbe apprezzato. Ottengo il seguente errore se provo ad eseguire questo script. Aldo troverà tutti i server sql remoti? Sto cercando di compilare un elenco di server SQL e dei loro database. Non è possibile chiamare un metodo su un'espressione a valore nullo. + $ valori = $ regkey.GetValueNames ()
Darryl Wilson

0

I comandi OSQL -Le SQLCMD -Lti mostreranno tutte le istanze sulla rete .

Se vuoi avere un elenco di tutte le istanze sul server e non hai voglia di fare script o programmazione, fai questo:

  1. Avviare Task Manager di Windows
  2. Seleziona la casella di controllo "Mostra processi da tutti gli utenti" o equivalente
  3. Ordina i processi per "Nome immagine"
  4. Trova tutte le sqlsrvr.exeimmagini

Le istanze devono essere elencate nella colonna "Nome utente" come MSSQL$INSTANCE_NAME.

E sono passato dal pensare che il server povero stesse eseguendo 63 istanze per rendermi conto che ne stava eseguendo tre (di cui una si comportava come un bullo totale con il carico della CPU ...)


0

Otterrà le istanze della query del registro del server SQL "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Nomi istanza \ SQL"

oppure Usa SQLCMD -L


-1

Se sei all'interno di SSMS potresti trovare più facile da usare:

SELECT @@Version

3
La domanda stessa afferma che non vogliono / non sono in grado di usare query SQL per determinare la versione
Trotski94
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.