Comment puis-je déterminer les instances SQL Server installées et leurs versions?

224

J'essaie de déterminer quelles instances de SQL Server / SQL Express j'ai installées (manuellement ou par programme), mais tous les exemples me disent d'exécuter une requête SQL pour le déterminer, ce qui suppose que je suis déjà connecté à une instance particulière .

Luc
la source
1
Voici un lien pour identifier avec sqlcmd msdn.microsoft.com/en-us/library/ms165662%28v=sql.90%29.aspx
Comment trouver vos instances SQL Server (nom de serveur) et versions youtube.com/watch?v=DLrxFXXeLFk
mloskot
pouvez-vous me dire les requêtes SQL dont vous parlez?
LearnByReading
1
@LearnByReading Voir la réponse de Mohammed Ifteqar Ahmed ci-dessous.
Luke
2
Vous pouvez interroger le registre: pmichaels.net/2016/02/12/…
Paul Michaels

Réponses:

209

Sur une ligne de commande:

SQLCMD -L

ou

OSQL -L

(Remarque: doit être un L majuscule)

Cela répertoriera tous les serveurs SQL installés sur votre réseau. Il existe des options de configuration que vous pouvez définir pour empêcher un serveur SQL de s'afficher dans la liste. Pour faire ça...

Sur la ligne de commande:

svrnetcn

Dans la liste des protocoles activés, sélectionnez «TCP / IP», puis cliquez sur propriétés. Il y a une case à cocher pour «Masquer le serveur».

George Mastros
la source
2
J'aime les options de ligne de commande, mais j'ai obtenu des résultats mitigés lorsque je les ai essayés sur ma boîte de développeur (non en réseau); fondamentalement, "sqlcmd -L" était le seul qui fonctionnait, et seulement si le service de navigation SQL Server était en cours d'exécution. Est-ce à prévoir?
Matt
J'adore quand il est SIMPLE et DROIT. J'avais du mal à trouver le bon nom de serveur à saisir pour une instance Amazon Web Service SQL Server. ThanX
Mehdi LAMRANI
1
Belles commandes mais pour une raison quelconque, il a détecté l'instance SQLExpress sur un réseau calculé mais n'a pas réussi à détecter l'instance SQLExpress sur ma machine locale.
pièces de rechange
1
@sparebytes: raison ici: dba.stackexchange.com/questions/18499/…
DonBecker
Essayez:C:\> sqllocaldb i
Contango
82

Vous pouvez interroger cette valeur de registre pour obtenir directement la version SQL:

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

Vous pouvez également interroger le nom de votre instance, puis utiliser sqlcmd avec le nom de votre instance que vous souhaitez:

Pour voir le nom de votre instance:

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

Exécutez ensuite ceci:

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

Si vous utilisez C ++, vous pouvez utiliser ce code pour obtenir les informations de registre.

Brian R. Bondy
la source
('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') affiche uniquement le serveur, exécutant uniquement une mais pas des instances ou des serveurs installés mais arrêtés
Gennady Vanin Геннадий Ванин
Merci, la requête a fonctionné pour moi. J'avais une machine et je voulais connaître l'instance par défaut et l'instance SQL Express qui était 2008 et qui 2008 R2. Je me suis connecté à chaque instance et j'ai exécuté la requête et cela m'a donné un numéro de version. Googler les chiffres était alors facile.
Meligy
3
Remarque, il semble que "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <version> \ Tools \ ClientSetup \ CurrentVersion" et "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ Instance Names" apparaissent dans la partie 32 bits du Registre, tandis que le chemin d'accès réel à l'instance: "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>" apparaît dans la ruche 64 bits.
NGaida,
Le registre est la définition source du logiciel installé. Votre solution me permet d'aller directement à la source, plutôt que d'utiliser un outil CLI, qui utilise finalement des valeurs de registre, ou un composant logiciel enfichable MMC qui utilise également le registre. Parfait
barrypicker
76

Toutes les instances installées doivent apparaître dans le composant logiciel enfichable Services de la console de gestion Microsoft. Pour obtenir les noms d'instance, accédez à Démarrer | Run | tapez Services.msc et recherchez toutes les entrées avec "Sql Server (Instance Name)".

dotnetengineer
la source
13
Commande PowerShell équivalente:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad
2
Mon ordinateur montre que MSSQL $ SQLEXPRESS s'exécute avec le nom d'affichage SQL Server (SQLEXPRESS) .... mais comment puis-je entrer cela dans un nom de serveur? La connexion de test montre des erreurs comme ... une erreur liée au réseau ou spécifique à l'instance s'est produite lors de la tentative de connexion au serveur SQL
webzy
47

- Requête T-SQL pour trouver la liste des instances installées sur une machine

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
la source
Bon! Je pense juste qu'il est nécessaire de se connecter, san'est-ce pas?
jyz
3
+1 La source des informations sur les instances est la même que la réponse de Brian. Quelqu'un pourrait aussi bien écrire du code C # pour obtenir la valeur du registre Windows; ce qui m'a fait penser que la réponse est redondante pour le moment mais c'est bien de connaître xp_regread. #Merci.
Mzn
Les résultats de la requête sont uniquement des noms d'instance. Est-il possible d'ajouter un niveau de compatibilité pour chaque instance aux résultats?
Marwan Almukh
16

Je sais que ce fil est un peu ancien, mais je suis tombé sur ce fil avant de trouver la réponse que je cherchais et de penser partager. Si vous utilisez SQLExpress (ou localdb), il existe un moyen plus simple de trouver vos noms d'instance. Sur une ligne de commande, tapez:

> sqllocaldb i

Cela répertorie les noms d'instance que vous avez installés localement. Le nom complet de votre serveur doit donc inclure (localdb) \ devant le nom de l'instance à connecter. En outre, sqllocaldb vous permet de créer de nouvelles instances ou de les supprimer ainsi que de les configurer. Voir: Utilitaire SqlLocalDB .

John Denton
la source
11

Si vous voulez simplement voir ce qui est installé sur la machine à laquelle vous êtes actuellement connecté, je pense que le processus manuel le plus simple consiste à simplement ouvrir le Gestionnaire de configuration SQL Server (à partir du menu Démarrer), qui affiche tous les services SQL (et services SQL uniquement ) sur ce matériel (en cours d'exécution ou non). Cela suppose que SQL Server 2005 ou supérieur; La recommandation de dotnetengineer d'utiliser la console de gestion des services vous montrera tous les services et devrait toujours être disponible (si vous utilisez des versions antérieures de SQL Server, par exemple).

Si vous recherchez un processus de découverte plus large, cependant, vous pouvez envisager des outils tiers tels que SQLRecon et SQLPing, qui analyseront votre réseau et créeront un rapport de toutes les instances de service SQL trouvées sur n'importe quel serveur auquel ils ont accès. Cela fait un moment que je n'ai pas utilisé des outils comme celui-ci, mais j'ai été surpris de ce qu'ils ont trouvé (à savoir, une poignée d'exemples que je ne connaissais pas). YMMV. Vous pouvez rechercher des détails sur Google, mais je pense que cette page contient les téléchargements appropriés: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

Mat
la source
1
SQL Server Configuration Manager était exactement ce dont j'avais besoin. Rapide et facile.
Chris
8

SQL Server permet aux applications de trouver des instances SQL Server dans le réseau actuel. La classe SqlDataSourceEnumerator expose ces informations au développeur de l'application, fournissant un DataTable contenant des informations sur tous les serveurs visibles. Ce tableau renvoyé contient une liste des instances de serveur disponibles sur le réseau qui correspond à la liste fournie lorsqu'un utilisateur tente de créer une nouvelle connexion et développe la liste déroulante contenant tous les serveurs disponibles dans la boîte de dialogue Propriétés de connexion. Les résultats affichés ne sont pas toujours complets. Pour récupérer la table contenant des informations sur les instances SQL Server disponibles, vous devez d'abord récupérer un énumérateur, en utilisant la propriété Instance partagée / statique:

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

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

Ian
la source
dois-je spécifier un sous-réseau sur ce ou domaine, son retour nul pour moi, pouvez-vous s'il vous plaît mettre à jour
transformateur
1
Pour ceux qui cherchent à utiliser .NET Core, SqlDataSourceEnumeratorn'est pas encore implémenté, mais est sur la liste à ajouter en fonction du problème GitHub .
Daniel Hill
5

Service de navigateur SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

Cade Roux
la source
1
oups ... sqlbrowser.exe manquant de l'emplacement habituel! Je dois avoir l'édition Microsoft (c'est-à-dire celle qui ne fonctionne pas) :-) Blague - nous aimons tous Microsoft, presque autant que ma belle-mère.
Sam
5

Si vous souhaitez déterminer cela dans un script, vous pouvez essayer ce qui suit:

sc \\server_name query | grep MSSQL

Remarque: grep fait partie des outils gnuwin32

Dale Sykora
la source
3
Vous pouvez utiliser findstrau lieu de greppour cela.
Pablo Montilla
Vous pouvez également utiliser FIND, ce qui conduit à la requête sc \\ nom_serveur | TROUVER "MSSQL"
Julio Nobre
5

Depuis la ligne de commande Windows, saisissez:

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

Où "nom_serveur" est le nom de tout serveur distant sur lequel vous souhaitez afficher les instances SQL.

Cela nécessite bien sûr suffisamment d'autorisations.

jimbo
la source
Ne fonctionne pas sur ma machine de développement, qui a 2008 R2 et plusieurs instances Express et LocalDB en cours d'exécution.
Christoph
4

Cette requête devrait vous obtenir le nom du serveur et le nom de l'instance:

SELECT @@SERVERNAME, @@SERVICENAME
Anonyme
la source
3
Cela vous indique uniquement le nom de l'instance actuelle associée à la requête en cours d'exécution. OP a demandé une liste de toutes les instances installées
Jay Walker
1
Cela ne fournit aucune information sur la version de SQL Server installée
Ahmad
2

J'ai eu le même problème. La commande "osql -L" n'affichait qu'une liste de serveurs mais sans nom d'instance (seule l'instance de mon serveur SQL local était affichée). Avec Wireshark, sqlbrowser.exe (qui se trouve dans le dossier partagé de votre installation SQL), j'ai trouvé une solution à mon problème.

L'instance locale est résolue par une entrée de registre. Les instances distantes sont résolues par diffusion UDP (port 1434) et SMB. Utilisez "sqlbrowser.exe -c" pour répertorier les demandes.

Ma configuration utilise 1 carte réseau physique et 3 cartes réseau virtuelles. Si j'ai utilisé la commande "osql -L", le sqlbrowser a affiché une demande de l'un des adaptateurs virtuels (qui se trouve dans un autre segment de réseau), au lieu de celui physique. osql sélectionne l'adpater par sa métrique. Vous pouvez voir la métrique avec la commande "route print". Pour ma configuration, la table de routage a montré une métrique inférieure pour l'adaptateur virtuel puis pour le physique. J'ai donc changé la métrique d'interface dans les propriétés du réseau en désélectionnant la métrique automatique dans les paramètres réseau avancés. osql utilise désormais l'adaptateur physique.

Daniel
la source
2

Une autre option consisterait à exécuter SQLSERVER discovery report..go sur le support d'installation de sqlserver et double-cliquer sur setup.exe

entrez la description de l'image ici

et dans l'écran suivant, accédez aux outils et cliquez sur le rapport de découverte comme indiqué ci-dessous

entrez la description de l'image ici

Cela vous montrera toutes les instances présentes ainsi que des fonctionnalités entières ... ci-dessous est un instantané sur mon PC entrez la description de l'image ici

TheGameiswar
la source
1

Je viens d'installer Sql server 2008, mais je n'ai pas pu me connecter à des instances de base de données. Les commandes @G Mastros publiées n'ont répertorié aucune instance active.

J'ai donc regardé dans les services et constaté que l'agent du serveur SQL était désactivé. Je l'ai corrigé en le réglant sur automatique puis en le démarrant.

Moulde
la source
1

J'ai eu ce même problème lorsque j'évaluais plus de 100 serveurs, j'avais un script écrit en C # pour parcourir les noms de service constitués de SQL. Lorsque des instances sont installées sur le serveur, SQL Server ajoute un service pour chaque instance avec un nom de service. Il peut varier pour différentes versions comme 2000 à 2008, mais il existe certainement un service avec un nom d'instance.

Je prends le nom du service et j'obtiens le nom de l'instance à partir du nom du service. Voici l'exemple de code utilisé avec WMI Query Result:

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
la source
0

Voici une méthode simple: allez dans Démarrer puis Programmes puis Microsoft SQL Server 2005 puis Outils de configuration puis SQL Server Configuration Manager puis SQL Server 2005 Network Configuration puis Ici vous pouvez localiser toutes les instances installées sur votre machine.

Badar
la source
0

Je sais que c'est un ancien article, mais j'ai trouvé une bonne solution avec PoweShell où vous pouvez trouver des instances SQL installées sur une machine locale ou distante, y compris la version et également étendre pour obtenir d'autres propriétés.

$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
la source
salut c'est super comment, puis-je envelopper cela dans une classe C # ou comment l'appeler à partir du code
transformateur
Salut. Ceci est ma première tentative de PowerShell, donc votre aide serait appréciée. J'obtiens l'erreur suivante si j'essaie d'exécuter ce script. Aldo trouvera-t-il tous les serveurs SQL distants? J'essaie de compiler une liste de serveurs SQL et de leurs bases de données. Vous ne pouvez pas appeler une méthode sur une expression de valeur nulle. + $ values ​​= $ regkey.GetValueNames ()
Darryl Wilson
0

Les commandes OSQL -Let SQLCMD -Lvous montreront toutes les instances sur le réseau .

Si vous souhaitez avoir une liste de toutes les instances sur le serveur et que vous ne souhaitez pas faire de script ou de programmation, procédez comme suit:

  1. Démarrez le Gestionnaire des tâches de Windows
  2. Cochez la case "Afficher les processus de tous les utilisateurs" ou équivalent
  3. Trier les processus par "Nom d'image"
  4. Localisez toutes les sqlsrvr.exeimages

Les instances doivent être répertoriées dans la colonne "Nom d'utilisateur" comme MSSQL$INSTANCE_NAME.

Et je suis passé de penser que le mauvais serveur exécutait 63 instances à se rendre compte qu'il en exécutait trois (dont l'un se comportait comme un intimidateur total avec la charge du processeur ...)

Erk
la source
0

Obtiendra les instances de la requête reg du serveur SQL "HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL"

ou utilisez SQLCMD -L

siva
la source
-1

Si vous êtes dans SSMS, vous pourriez trouver plus facile à utiliser:

SELECT @@Version
Craig
la source
3
La question elle-même déclare qu'ils ne veulent pas / ne sont pas en mesure d'utiliser les requêtes SQL pour déterminer la version
Trotski94