如何获取本地计算机上所有MS SQL Server实例的列表?

Dav*_*ang 30 sql-server

这似乎是一个相当普遍的问题,但我见过的答案都没有特别令人满意.我想获得本地计算机上安装的MS SQL Server实例的名称列表,无论它们是否已启动.出于本讨论的目的,我只是找到SQL 2005及更新版本的实例; 我可以使用"遗留"方法处理2000及更早版本(即查看注册表).我所要求的是它不依赖于SQL Server Browser服务(现在默认禁用),即使应用程序是32位,也会返回64位实例.

我见过的建议:

  • 挖掘注册表:据说不推荐,因为注册表项没有记录; MS可能会在将来更改它们.更重要的是,据我所知,64位的MSSQL实例进入64位HKLM\SOFTWARE\Microsoft\Microsoft SQL Server InstalledInstances,32位实例进入32位实例,所以32-位应用程序将看不到任何64位实例.

  • 使用上一篇博客文章中提到的SQL WMI Provider for Configuration Management.这似乎是最接近的,但尽管作者劝告避免使用注册表,因为它可能会改变,但事实证明在SQL 2005和2008之间更改了WMI命名空间:在2005年,它是root\Microsoft\SqlServer\ComputerManagement,但在2008年它是root\Microsoft\SqlServer\ComputerManagement10.它将来会再次发生变化吗?也就是说,如果我必须为未来版本的SQL更新我的应用程序,这可能不是一个大问题.

    我使用WMI方法的问题是SqlService类返回服务名称列表,而我想要实例名称.例如,我只想要INSTANCE而不是MSSQL $ INSTANCE.剥离"MSSQL $"是微不足道的,处理默认实例的特殊情况也是如此,但它是否可靠?AFAIK,技术上没有理由无法重命名服务,同时保持实例名称相同.也就是说,除非有人有更好的方法,否则我认为我会接受它(获取服务名称并剥离MSSQL $).ServerSettings类返回实例名称,但它没有看到我在计算机上安装的64位SQL 2008 R2 Express实例.

  • 使用SmoApplication.EnumAvailableSqlServers(true):这似乎取决于SQL Server Browser服务.如果浏览器服务启动它会很好,但如果不是,我只得到一行,其中计算机名称为服务器名称和空白实例名称.

  • 使用System.Data.Sql.SqlDataSourceEnumerator.GetDataSources():相同的问题,它取决于SQL Server浏览器.

那么,还有其他一些方法可能会更好吗?

8kb*_*8kb 12

我可以使用Powershell在笔记本电脑上看到2005和2008 SQL Server实例:

Get-Service | Where-Object {$_.Name -like 'MSSQL$*'}
Run Code Online (Sandbox Code Playgroud)

探索的其他可能性包括枚举RegisteredServers命名空间.

  • 嗯,靠谱吗?也就是说,是否保证 MSSQL 的 DisplayName 始终以“SQL Server (”开头?我正在考虑本地化版本——我安装的唯一非英语版本是法语,在那里也可以。但是,由于其他一些SQL 相关服务 DisplayNames _are_ 本地化(例如,“SQL Server Agent (INSTANCE)”在法语中是“Agent SQL Server (INSTANCE)”),我不相信没有某些语言 MSSQL 的 DisplayName 不以“开头SQL Server("。好像找一个以"MSSQL$"开头的服务名比这个方法更可靠。 (2认同)
  • 不适用于名为`MSSQLSERVER`的默认实例(即不以`MSSQL $`开头). (2认同)

小智 5

从命令提示符(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
Run Code Online (Sandbox Code Playgroud)