这似乎是一个相当普遍的问题,但我所看到的答案都没有特别令人满意。我想获得本地计算机上安装的MS SQL Server实例的名称列表,无论它们是否已启动。出于本讨论的目的,我只是找到SQL 2005及更新版本的实例;我可以使用“遗留”方法处理2000及更早版本(即查看注册表)。我所要求的是它不依赖于SQL Server Browser服务(现在默认禁用它),即使应用程序是32位,也会返回64位实例。
我见过的建议:
通过注册表:据说Not recommended由于注册表项没有记录; 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类返回服务名称列表,而我想要实例名称。例如,我只想要实例,而不是MSSQL $ INSTANCE。剥离“MSSQL $”是微不足道的,处理默认实例的特殊情况也是如此,但它是否可靠? AFAIK,技术上没有理由无法重命名服务,同时保持实例名称相同。也就是说,除非有人有更好的方法,否则我认为我会接受它(获取服务名称并剥离MSSQL $)。 ServerSettings类返回实例名称,但它没有看到我在计算机上安装的64位SQL 2008 R2 Express实例。
使用SmoApplication.EnumAvailableSqlServers(true)
:这似乎取决于SQL Server Browser服务。如果浏览器服务启动它会很好,但如果不是,我只得到一行,其中计算机名称为服务器名称和空白实例名称。
使用System.Data.Sql.SqlDataSourceEnumerator.GetDataSources()
:它依赖于SQL Server浏览器的相同问题。
那么,还有其他方法可能会更好吗?
答案 0 :(得分:11)
我可以使用Powershell在我的笔记本电脑上看到2005和2008 SQL Server实例:
Get-Service | Where-Object {$_.Name -like 'MSSQL$*'}
探索的其他可能性包括枚举RegisteredServers命名空间。
答案 1 :(得分: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
答案 2 :(得分:2)
我知道这是一篇较旧的帖子,但我今天确实来到这篇文章,寻找一种方法来查找已安装的SQL Server实例。尽管给出的两个答案很有帮助,但我认为它们仅适用于SQL Server的已安装和运行实例。如果安装了SQL Server配置管理器,则应在SQL Server服务节点下列出所有已安装的实例。在这里,您可能会找到已安装但未运行的实例。您可以右键单击该实例并启动它。我相信还有其他方法可以做到这一点;这只是我今天派上用场的一种方式,我想我会分享它。
答案 3 :(得分:1)
这可能会有所帮助,我在Sql Server 2008中试过这个:
select * from sys.servers
答案 4 :(得分:0)