Comment puis-je déterminer les instances de SQL Server installées et leurs versions?
j'essaye de déterminer quelles instances de sql server/sql express j'ai installées (manuellement ou programmatiquement) mais tous les exemples me disent d'exécuter une requête SQL pour déterminer ceci qui suppose que je suis déjà connecté à une instance particulière.
18 réponses
en ligne de commande:
SQLCMD -L
ou
OSQL -L
(Note: doit être un capital L)
cette liste énumère tous les serveurs sql installés sur votre réseau. Il y a des options de configuration que vous pouvez paramétrer pour empêcher un serveur SQL d'apparaître dans la liste. Pour ce faire...
en ligne de commande:
svrnetcn
dans la liste des Protocoles activés, sélectionnez "TCP / IP", puis cliquez propriété. Il y a une case à cocher pour 'Hide server'.
vous pouvez interroger cette valeur de Registre pour obtenir la version SQL directement:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Tools\ClientSetup\CurrentVersion
vous pouvez aussi 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
alors exécutez ceci:
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')
si vous utilisez C++, vous pouvez utiliser ce code pour obtenir les informations du registre.
toutes les instances installées doivent apparaître dans le Snap-In des Services de Microsoft Management Console. Pour obtenir les noms d'instance, allez à Démarrer | Exécuter | tapez Services.msc et rechercher toutes les entrées avec " Sql Server (Instance Name)".
-- 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
si vous voulez juste voir ce qui est installé sur la machine dans laquelle vous êtes actuellement connecté, je pense que le processus manuel le plus simple est d'ouvrir simplement le Gestionnaire de Configuration du serveur SQL (à partir du menu Démarrer), qui affiche tous les Services SQL (et seulement services SQL) sur ce matériel (en cours d'exécution ou non). Cela suppose SQL Server 2005, ou plus; dotnetengineer recommandation de l'utilisation de la Console de gestion des Services montrera vous tous les services, et devrait toujours être disponible (si vous utilisez des versions plus anciennes de SQL Server, par exemple).
si vous êtes à la recherche d'un processus de découverte plus large, cependant, vous pourriez envisager des outils tiers tels que SQLRecon et SQLPing, qui va scanner votre réseau et construire un rapport de toutes les instances de service SQL trouvées sur n'importe quel serveur auquel ils ont accès. Cela fait longtemps que j'ai utilisé des outils comme celui-ci, mais j'ai été surpris de ce qu'ils ont trouvé (à savoir, un quelques exemples que je ne savais pas qu'ils existaient). YMMV. Vous pouvez Google pour les détails, mais je crois que cette page a les téléchargements pertinents: http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx
je sais que ce fil est un peu vieux, mais je suis tombé sur ce fil avant de trouver la réponse que je cherchais et pensé que je partagerais. Si vous utilisez SQLExpress (ou localdb), il y a une façon plus simple de trouver les noms de vos instances. À une ligne de commande type:
> sqllocaldb i
cette liste énumère les noms d'instance que vous avez installés localement. Ainsi, le nom complet de votre serveur doit inclure (localdb)\ devant le nom de l'instance à connecter. En outre, sqllocaldb vous permet de créer nouvelles instances ou supprimez-les ainsi que configurez-les. Voir: Sqllocaldb Utility .
SQL Server Browser Service http://msdn.microsoft.com/en-us/library/ms181087.aspx
SQL Server permet aux applications de trouver des instances SQL Server dans le réseau courant. La classe SqlDataSourceEnumerator expose ces informations au développeur d'application, fournissant un DataTable contenant des informations sur tous les serveurs visibles. Cette table retournée contient une liste d'instances de serveur disponible sur le réseau qui correspond à la liste fournie lorsqu'un utilisateur tente de créer une nouvelle connexion, et élargit la liste déroulante contenant tous les serveurs disponibles sur la boîte de dialogue Propriétés de connexion. Les résultats affichés ne sont pas toujours complètes. Afin de 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é D'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("============================");
}
}
}
de msdn http://msdn.microsoft.com/en-us/library/a6t1z9x2 (v = 80).aspx
si vous êtes intéressé à le déterminer dans un script, vous pouvez essayer ce qui suit:
sc \server_name query | grep MSSQL
Note: grep fait partie des outils gnuwin32
à Partir de Windows en ligne de commande, tapez:
SC \server_name query | find /I "SQL Server ("
où" server_name " est le nom de tout serveur distant sur lequel vous souhaitez afficher les instances SQL.
cela nécessite assez de permissions bien sûr.
j'ai eu le même problème. La commande" osql-L " n'affichait qu'une liste de serveurs mais sans noms d'instance (seule L'instance de mon serveur SQL local était affichée). Avec Wireshark, sqlbrowser.exe (qui peut être trouvé dans le dossier partagé de votre installation SQL) j'ai trouvé une solution pour mon problème.
l'instance locale est résolue par une entrée dans le registre. Les instances distantes sont résolues par UDP broadcast (port 1434) et SMB. Utilisez " sqlbrowser.exe-c " pour énumérer les demande.
ma configuration utilise 1 adaptateur de réseau physique et 3 adaptateurs de réseau virtuel. Si j'utilise la commande" osql-L", le sqlbrowser affiche une requête d'un des adaptateurs virtuels (qui se trouve dans un autre segment du réseau), au lieu d'une requête 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 plus basse pour l'adaptateur virtuel puis pour le physique. Donc j'ai changé l'interface métrique dans les propriétés réseau en désélectionnant Métrique automatique dans les paramètres réseau avancés. osql utilise maintenant l'adaptateur physique.
cette requête devrait vous donner le nom du serveur et le nom de l'instance:
SELECT @@SERVERNAME, @@SERVICENAME
j'ai eu ce même problème quand j'évaluais plus de 100 SERVEURS, j'ai eu un script écrit en C# pour parcourir les noms de service se composent 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 est certain qu'il y a un service avec le nom de l'instance.
je prends le nom du service et j'obtiens le nom de l'instance à partir du nom du service. Voici le code d'exemple utilisé avec la requête WMI Résultat:
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);
}
si votre SSMS interne vous le trouvez plus facile à utiliser:
SELECT @@Version
je viens d'installer Sql server 2008, mais je n'ai pu me connecter à aucune instance de base de données. Les commandes postées par @G Mastros ne mentionnaient aucune instance active.
alors j'ai regardé dans les services et j'ai trouvé que L'agent de SQL server était désactivé. J'ai corrigé par la mise à automatique et démarrage.
Voici une méthode simple: aller à Commencer alors Les programmes, puis Microsoft SQL Server 2005 then Outils de Configuration SQL Server Configuration Manager then SQL Server 2005 Network Configuration then Ici vous pouvez localiser toutes les instances installées sur votre machine.
je sais que c'est un ancien poste, 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 aussi être étendre 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}
une autre option serait D'exécuter SQLSERVER discovery report..allez sur les supports d'installation de sqlserver et double-cliquez sur setup.exe
et dans l'écran suivant,allez à outils et cliquez sur rapport de découverte comme indiqué ci-dessous
cela vous montrera toutes les instances présentes ainsi que l'intégralité caractéristique..ci-dessous est un aperçu sur mon pc