Comment get une list de toutes les instances MS SQL Server sur la machine locale?

Cela semble être une question assez courante, mais aucune des réponses que j'ai vues n'a été particulièrement satisfaisante. Je veux get une list des noms des instances MS SQL Server installées sur la machine locale, qu'elles soient démarrées ou non. Pour les besoins de cette discussion, je suis OK avec juste find des instances de SQL 2005 et plus récent; Je peux gérer 2000 et plus tôt en utilisant des methods "héritées" (à savoir, regardez dans le registre). Ce dont j'ai besoin, c'est qu'il ne dépende pas du service SQL Server Browser (il est désactivé par défaut de nos jours), et que les instances 64 bits sont renvoyées même lorsque l'application est en 32 bits.

Suggestions que j'ai vues:

  • Creuser dans le registre: Supposément Non recommandé en raison des inputs de registre étant non documentées; MS peut les changer à l'avenir. Plus important encore, autant que je sache, les instances 64 bits de MSSQL vont dans le SQL Server InstalledInstances HKLM \ SOFTWARE \ Microsoft \ Microsoft 64 bits, et les instances 32 bits vont dans 32 bits, donc 32- L'application bit ne verra aucune instance 64 bits.

  • Utilisez le fournisseur WMI SQL pour la gestion de la configuration mentionné dans l'article de blog précédent. Cela semble être le plus proche, mais malgré l'avertissement de l'auteur pour éviter d'utiliser le registre car il pourrait changer, il s'avère que l'espace de noms WMI a changé entre SQL 2005 et 2008: en 2005, c'est root \ Microsoft \ SqlServer \ ComputerManagement c'est root \ Microsoft \ SqlServer \ ComputerManagement10. Cela changera-t-il à l'avenir? Cela dit, ce n'est probablement pas un gros problème si je dois mettre à jour mon application pour une future version de SQL.

    Le problème que j'ai avec la méthode WMI est que la class SqlService renvoie une list des noms de service, alors que je veux les noms d' instance . Par exemple, au lieu de MSSQL $ INSTANCE, je veux juste INSTANCE. Supprimer le "MSSQL $" est sortingvial, tout comme le cas particulier de l'instance par défaut, mais est-ce fiable? AFAIK, il n'y a techniquement aucune raison pour que le service ne puisse pas être renommé, tout en gardant le même nom d'instance. Cela dit, à less que quelqu'un ait une meilleure méthode, je pense que je vais aller avec cela (get les noms de service et dépouiller le MSSQL $). La class ServerSettings renvoie le nom de l'instance, mais elle ne voit pas une instance 64 bits de SQL 2008 R2 Express que j'ai installée sur ma machine.

  • Utilisez SmoApplication.EnumAvailableSqlServers(true) : cela semble dépendre du service SQL Server Browser. Cela fonctionne très bien si le service Browser est démarré, mais si ce n'est pas le cas, je reçois une seule ligne avec le nom de l'ordinateur comme nom de server et un nom d'instance vide.

  • Use System.Data.Sql.SqlDataSourceEnumerator.GetDataSources() : même problème qui dépend du browser SQL Server.

Alors, y a-t-il d'autres methods qui pourraient mieux fonctionner?

Je suis capable de voir les deux instances SQL Server 2005 et 2008 sur mon ordinateur portable en utilisant Powershell:

 Get-Service | Where-Object {$_.Name -like 'MSSQL$*'} 

D'autres possibilités à explorer incluent l'énumération à travers l'espace de noms RegisteredServers .

À partir d'une invite de command (cmd.exe):

 sc query|findstr "DISPLAY_NAME"|findstr /C:"SQL Server (" > myfile.txt FOR /F " tokens=2 delims=()" %i in (myfile.txt) do @echo %computername%\%i 

Je sais que c'est un post plus ancien, mais je suis venu à ce post aujourd'hui à la search d'un moyen de find des instances installées de SQL Server. Bien que les deux réponses données soient utiles, je pense qu'elles ne concernent que les instances installées et en cours d'exécution de SQL Server. Si SQL Server Configuration Manager est installé, toutes les instances installées doivent être répertoriées sous le nœud Services SQL Server. Ici, vous pouvez find une instance installée mais non exécutée. Vous pouvez faire un clic droit sur l'instance et la démarrer. Je suis sûr qu'il existe d'autres moyens de le faire. C'est juste un moyen qui m'a été utile aujourd'hui et j'ai pensé que je le partagerais.

Cela peut être utile, j'ai essayé ceci dans Sql Server 2008:

 select * from sys.servers 

Le service SQL Browser (s'il est actif) parle SSRP / MS-SQLR sur le port UDP 1434.

C'est le composant qui est utilisé pour la découverte à distance des instances (et aussi la détermination de leur port). Cela aide aussi à la découverte dans un réseau.

Il est cependant désactivé par défaut (bonne chose pour la réduction de surface).