You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取本地网络中可用的SQL服务器(或实例)列表(优先主机名)

嘿,我来给你捋捋怎么获取本地网络里的SQL Server实例列表,就像你在DSN数据源设置里看到的那种扫描效果,优先拿到主机名:

方法一:用SQL Server自带工具(零代码,最省心)

1. 通过ODBC数据源管理器(就是你截图里的操作)

  • 打开「ODBC数据源管理器」(可以在控制面板里找,或者直接搜odbcad32.exe
  • 切换到「用户DSN」或「系统DSN」标签,点击「添加」
  • 选择「SQL Server」驱动,点击「完成」
  • 在弹出的窗口里,点击「服务器」输入框旁边的下拉箭头,系统就会自动扫描本地网络里的SQL Server实例,列表里会显示主机名(默认实例)或者主机名\实例名(命名实例)

2. 通过SQL Server Management Studio (SSMS)

  • 打开SSMS,在「连接到服务器」窗口里,点击「服务器名称」的下拉箭头
  • 选择「浏览更多...」,在弹出的「查找服务器」窗口里切换到「本地服务器」或「网络服务器」标签,就能看到扫描到的所有SQL实例,同样优先显示主机名相关的条目
方法二:用PowerShell脚本快速提取

如果你想批量获取或者自动化处理,用PowerShell一行代码就能搞定:

# 获取所有可用SQL实例,提取主机名(ServerName)和实例名(InstanceName)
[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() | Select-Object ServerName, InstanceName
  • 执行后会返回一个列表,ServerName就是主机名;如果是命名实例,InstanceName会有值,组合起来就是ServerName\InstanceName
  • 这个方法和ODBC扫描用的是同一个底层机制,结果和你截图里的列表一致
方法三:用C#代码集成到应用中

如果要在自己的程序里实现这个功能,可以用.NET的SqlDataSourceEnumerator类,代码示例如下:

using System;
using System.Data.Sql;

class Program
{
    static void Main()
    {
        // 获取数据源枚举器
        SqlDataSourceEnumerator enumerator = SqlDataSourceEnumerator.Instance;
        // 获取所有可用SQL实例
        System.Data.DataTable table = enumerator.GetDataSources();

        // 遍历结果,优先输出主机名
        foreach (System.Data.DataRow row in table.Rows)
        {
            string serverName = row["ServerName"].ToString();
            string instanceName = row["InstanceName"].ToString();
            // 组合完整实例名
            string fullInstance = string.IsNullOrEmpty(instanceName) ? serverName : $"{serverName}\\{instanceName}";
            Console.WriteLine($"可用SQL实例:{fullInstance}(主机名:{serverName})");
        }
    }
}
  • 这段代码会输出每个实例的主机名和完整实例名,和DSN扫描的逻辑完全一致
注意事项
  • 扫描依赖SQL Server Browser服务:如果是命名实例,目标机器上的SQL Server Browser服务必须开启,否则扫描不到
  • 防火墙限制:如果目标机器的防火墙屏蔽了UDP 1434端口,也会导致扫描失败
  • 隐藏实例:如果实例被配置为隐藏(通过HideInstance注册表项设置),则不会出现在扫描列表里

内容的提问来源于stack exchange,提问作者JonyStack

火山引擎 最新活动