当您有服务器名称时,如何列出 SQL 服务器的实例名称?

How do you list instance names for SQL Server when you have the server name?

一台机器上可以有多个 sql 服务器实例。我试图在任何给定的远程机器上识别 sql 服务器引擎 运行 的每个实例。其他问题中的所有其他答案仅针对本地机器。

我看过SqlDataSourceEnumerator,它搜索网络,我知道我要搜索的计算机。

我看过 SmoApplication.EnumAvailableSqlServers,但它需要 'instance name',这正是我要找的

如何使用 .net 询问机器以获取 SQL 服务器实例信息?

尝试以下方法

Dim dt as dataTable= SqlDataSourceEnumerator.Instance.GetDataSources()

For each dr as datarow in dt.Select("[ServerName] = '" & strServername & "'")

Msgbox(string.Concat(dr("ServerName"), "\", dr("InstanceName"))))

NEXT

其中strServername是机器名

或尝试使用 Linq

Dim lst as List(of string) = SqlDataSourceEnumerator.Instance.GetDataSources().where(Function(x) x.servername = strServername).Select(Function(y) y.Servername & "\" & y.Instancename).ToList()

此博客展示了如何列出安装在计算机 using System.ServiceProcess;

上的 sql 服务器的实例

https://blogs.msdn.microsoft.com/sqlserverfaq/2009/03/07/how-to-detect-sql-server-instances-features-installed-on-a-machine/

我缺少的关键是 ServiceController.GetService() 静态方法有一个重载,它接受一个字符串 'servername'

class InstanceInfoRetriever
    {
        public IEnumerable<string> GetInstanceNames(string serverName)
        {
            var servicenames = new[] { "MSSQL", "SQL Server" };
            var services = ServiceController.GetServices(serverName);
            var sqlservices = services.Where(s => servicenames.Any(n => s.ServiceName.Contains(n)));
            return sqlservices.Select(s => s.ServiceName);

        }
    }