如何列出本地计算机上安装的SQL Server实例? (仅限本地)

我想知道是否有一种方法可以列出本地计算机上安装的SQL Server实例。

SqlDataSourceEnumeratorEnumAvailableSqlServers没有这个技巧,因为我不需要通过本地网络的实例。

您可以使用localOnly = True调用EnumAvailableSQlServers

 public static DataTable EnumAvailableSqlServers(bool localOnly) 

请参阅EnumAvailableSqlServers的MSDN文档

MS建议不直接访问Windows注册表,因为它们可以更改密钥/路径。 但我同意SmoApplication.EnumAvailableSqlServers()SqlDataSourceEnumerator.Instance无法在64位平台上提供实例。

从Windows注册表获取数据,请记住x86x64平台之间注册表访问的差异。 64位版本的Windows将数据存储在系统注册表的不同部分,并将它们组合到视图中。 所以使用RegistryView是必不可少的。

 using Microsoft.Win32; RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) { RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false); if (instanceKey != null) { foreach (var instanceName in instanceKey.GetValueNames()) { Console.WriteLine(Environment.MachineName + @"\" + instanceName); } } } 

如果您在64位操作系统上寻找32位实例(非常奇怪,但可能),您需要查看:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server 
 SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance; System.Data.DataTable table = instance.GetDataSources(); foreach (System.Data.DataRow row in table.Rows) { if (row["ServerName"] != DBNull.Value && Environment.MachineName.Equals(row["ServerName"].ToString())) { string item = string.Empty; item = row["ServerName"].ToString(); if(row["InstanceName"] != DBNull.Value || !string.IsNullOrEmpty(Convert.ToString(row["InstanceName"]).Trim())) { item += @"\" + Convert.ToString(row["InstanceName"]).Trim(); } listview1.Items.Add(item); } } 

您可以使用注册表在本地系统中获取SQL Server实例名称

 private void LoadRegKey() { RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names"); foreach (string sk in key.GetSubKeyNames()) { RegistryKey rkey = key.OpenSubKey(sk); foreach (string s in rkey.GetValueNames()) { MessageBox.Show("Sql instance name:"+s); } } } 

结合几种方法:

 using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Wmi; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using Microsoft.Win32; namespace SqlServerEnumerator { class Program { static void Main(string[] args) { Dictionary>> methods = new Dictionary>> { {"CallSqlBrowser", GetLocalSqlServerInstancesByCallingSqlBrowser}, {"CallSqlWmi32", GetLocalSqlServerInstancesByCallingSqlWmi32}, {"CallSqlWmi64", GetLocalSqlServerInstancesByCallingSqlWmi64}, {"ReadRegInstalledInstances", GetLocalSqlServerInstancesByReadingRegInstalledInstances}, {"ReadRegInstanceNames", GetLocalSqlServerInstancesByReadingRegInstanceNames}, {"CallSqlCmd", GetLocalSqlServerInstancesByCallingSqlCmd}, }; Dictionary> dictionary = methods .AsParallel() .ToDictionary(v => v.Key, v => v.Value().OrderBy(n => n, StringComparer.OrdinalIgnoreCase).ToList()); foreach (KeyValuePair> pair in dictionary) { Console.WriteLine(string.Format("~~{0}~~", pair.Key)); pair.Value.ForEach(v => Console.WriteLine(" " + v)); } Console.WriteLine("Press any key to continue."); Console.ReadKey(); } private static List GetLocalSqlServerInstancesByCallingSqlBrowser() { DataTable dt = SmoApplication.EnumAvailableSqlServers(true); return dt.Rows.Cast() .Select(v => v.Field("Name")) .ToList(); } private static List GetLocalSqlServerInstancesByCallingSqlWmi32() { return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use32bit); } private static List GetLocalSqlServerInstancesByCallingSqlWmi64() { return LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture.Use64bit); } private static List LocalSqlServerInstancesByCallingSqlWmi(ProviderArchitecture providerArchitecture) { try { ManagedComputer managedComputer32 = new ManagedComputer(); managedComputer32.ConnectionSettings.ProviderArchitecture = providerArchitecture; const string defaultSqlInstanceName = "MSSQLSERVER"; return managedComputer32.ServerInstances.Cast() .Select(v => (string.IsNullOrEmpty(v.Name) || string.Equals(v.Name, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ? v.Parent.Name : string.Format("{0}\\{1}", v.Parent.Name, v.Name)) .OrderBy(v => v, StringComparer.OrdinalIgnoreCase) .ToList(); } catch (SmoException ex) { Console.WriteLine(ex.Message); return new List(); } catch (Exception ex) { Console.WriteLine(ex); return new List(); } } private static List GetLocalSqlServerInstancesByReadingRegInstalledInstances() { try { // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstalledInstances string[] instances = null; using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server")) { if (rk != null) { instances = (string[])rk.GetValue("InstalledInstances"); } instances = instances ?? new string[] { }; } return GetLocalSqlServerInstances(instances); } catch (Exception ex) { Console.WriteLine(ex); return new List(); } } private static List GetLocalSqlServerInstancesByReadingRegInstanceNames() { try { // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL string[] instances = null; using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL")) { if (rk != null) { instances = rk.GetValueNames(); } instances = instances ?? new string[] { }; } return GetLocalSqlServerInstances(instances); } catch (Exception ex) { Console.WriteLine(ex); return new List(); } } private static List GetLocalSqlServerInstances(string[] instanceNames) { string machineName = Environment.MachineName; const string defaultSqlInstanceName = "MSSQLSERVER"; return instanceNames .Select(v => (string.IsNullOrEmpty(v) || string.Equals(v, defaultSqlInstanceName, StringComparison.OrdinalIgnoreCase)) ? machineName : string.Format("{0}\\{1}", machineName, v)) .ToList(); } private static List GetLocalSqlServerInstancesByCallingSqlCmd() { try { // SQLCMD -L int exitCode; string output; CaptureConsoleAppOutput("SQLCMD.exe", "-L", 200, out exitCode, out output); if (exitCode == 0) { string machineName = Environment.MachineName; return output.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) .Select(v => v.Trim()) .Where(v => !string.IsNullOrEmpty(v)) .Where(v => string.Equals(v, "(local)", StringComparison.Ordinal) || v.StartsWith(machineName, StringComparison.OrdinalIgnoreCase)) .Select(v => string.Equals(v, "(local)", StringComparison.Ordinal) ? machineName : v) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); } return new List(); } catch (Exception ex) { Console.WriteLine(ex); return new List(); } } private static void CaptureConsoleAppOutput(string exeName, string arguments, int timeoutMilliseconds, out int exitCode, out string output) { using (Process process = new Process()) { process.StartInfo.FileName = exeName; process.StartInfo.Arguments = arguments; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.CreateNoWindow = true; process.Start(); output = process.StandardOutput.ReadToEnd(); bool exited = process.WaitForExit(timeoutMilliseconds); if (exited) { exitCode = process.ExitCode; } else { exitCode = -1; } } } } }