如何确定已安装的SQL Server实例及其版本?

258

我想确定我安装了哪些 SQL Server/SQL Express 实例(手动或通过编程方式),但所有的示例都告诉我运行一个 SQL 查询来确定这一点,这需要假定我已经连接到特定的实例。


2
这里有一个链接,介绍如何使用 sqlcmd 进行身份验证:http://msdn.microsoft.com/zh-cn/library/ms165662(v=sql.90).aspx - user2477477
如何查找SQL Server实例(服务器名称)和版本 https://www.youtube.com/watch?v=DLrxFXXeLFk - mloskot
你能告诉我你所说的SQL查询吗? - LearnByReading
1
@LearnByReading 请查看Mohammed Ifteqar Ahmed在下面的回答。 - Luke
2
您可以查询注册表:http://pmichaels.net/2016/02/12/list-the-installed-instances-of-sql-server/ - Paul Michaels
其他的解决方案对我没有用,因为我确定我有几个命名实例,而这些解决方案只显示默认实例。但是Visual Studios SQL Server对象资源管理器窗口列出了所有本地命名和未命名的SQL Server实例。只需点击添加SQL Server图像按钮,在本地箭头下列出所有实例即可。希望这可以帮到你。 - yigitt
21个回答

226

在命令行中:

SQLCMD -L
或者
OSQL -L

(注:L 必须大写)

这将列出网络上安装的所有 SQL 服务器。您可以设置配置选项来防止 SQL Server 在列表中显示。要做到这一点...

在命令行中:

svrnetcn
在启用的协议列表中,选择“TCP/IP”,然后单击属性。有一个“隐藏服务器”的复选框。

3
我喜欢命令行选项,但在我的(非网络化的)开发者机器上尝试时,结果参差不齐;基本上只有 "sqlcmd -L" 生效,并且仅在 SQL Server 浏览器服务正在运行时生效。这是否是预期的结果? - Matt
我喜欢简单明了的东西。我曾经苦苦寻找适用于Amazon Web Service SQL Server实例的正确服务器名称。谢谢。 - Mehdi LAMRANI
1
很好的命令,但出于某种原因它检测到了网络计算机上的SQLExpress实例,却未能检测到我本地机器上的SQLExpress实例。 - sparebytes
1
@sparebytes:原因在这里:http://dba.stackexchange.com/questions/18499/why-does-sqlcmd-lc-not-show-the-local-instance - DonBecker
2
尝试执行:C:\> sqllocaldb i - Contango
显示剩余3条评论

84

所有已安装的实例应在Microsoft管理控制台的服务快照中显示。要获取实例名称,请转到“开始”|“运行”|键入“Services.msc”,并查找所有具有“Sql Server(实例名称)”的条目。


21
等效的 PowerShell 命令:Get-Service | ?{ $_.Name -like "MSSQL*" } - orad
2
我的电脑显示MSSQL$SQLEXPRESS正在运行,显示名称为SQL Server(SQLEXPRESS) ...但我该如何在服务器名称中输入这个?测试连接时显示错误,例如...当尝试连接到SQL Server时发生了与网络相关或实例特定的错误。 - webzy

83

您可以查询此注册表值以直接获取SQL版本:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ClientSetup\CurrentVersion

或者,您可以查询实例名称,然后使用您想要的实例名称与 sqlcmd 进行交互:

查看您的实例名称:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names

然后执行这个:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

如果您使用C++,可以使用此代码获取注册表信息。


'productversion',SERVERPROPERTY('productlevel'),SERVERPROPERTY('edition')仅显示运行中的服务器,仅限于单个服务器,而不是实例或已安装但已停止的服务器。 - Gennady Vanin Геннадий Ванин
谢谢,查询对我起作用了。我有一台机器,想知道默认实例和 SQL Express 实例是哪个版本,分别是2008和2008 R2。我连接到每个实例并运行查询,得到了一个版本号。然后通过谷歌搜索这些数字很容易就找到了。 - Meligy
3
注意,似乎注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server<version>\Tools\ClientSetup\CurrentVersion”和“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names”出现在32位部分,而实际实例路径:“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server<instancename>”出现在64位部分。 - NGaida
注册表是已安装软件的源定义。您的解决方案允许我直接访问源,而不是使用最终使用注册表值的CLI工具,或者也使用注册表的MMC快照。完美。 - barrypicker

54

-- 查找安装在计算机上的实例列表的 T-SQL 查询

DECLARE @GetInstances TABLE
( Value nvarchar(100),
 InstanceNames nvarchar(100),
 Data nvarchar(100))

Insert into @GetInstances
EXECUTE xp_regread
  @rootkey = 'HKEY_LOCAL_MACHINE',
  @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
  @value_name = 'InstalledInstances'

Select InstanceNames from @GetInstances 

不错!我只是认为需要连接作为 sa,对吧? - jyz
3
信息来源与Brian的答案相同。有人可能会写C#代码从Windows注册表中获取值,这让我暂时认为答案是多余的,但了解xp_regread还是不错的。#感谢。 - Lzh
查询结果仅为实例名称,是否可以将每个实例的兼容性级别添加到结果中? - Marwan Almukh
这不会区分与SQL Server完整版和Express版本相关联的实例。 - Scott Howard

26

我知道这个帖子有点旧,但在找到我要的答案之前,我看到了这个帖子,所以我想分享一下。如果您正在使用SQLExpress(或localdb),则有一种更简单的方法来查找实例名称。在命令行中键入:

> sqllocaldb i

这将列出您在本地安装的实例名称。因此,您的完整服务器名称应该在实例名称前面包括(localdb)\以进行连接。另外,sqllocaldb允许您创建新实例或删除它们以及配置它们。请查看:SqlLocalDB Utility


11
如果您只想查看当前登录的计算机上安装了什么,我认为最直接的手动方法是打开SQL Server Configuration Manager(从开始菜单),它会显示该硬件上所有SQL服务(仅限SQL服务)(无论是否运行)。这假定SQL Server 2005或更高版本; dotnetengineer建议使用服务管理控制台将显示所有服务,并且应始终可用(例如,如果您正在运行较早版本的SQL Server)。
但是,如果您正在寻找更广泛的发现过程,您可以考虑使用第三方工具,如SQLRecon和SQLPing,它们将扫描您的网络并构建报告,列出它们可以访问的任何服务器上发现的所有SQL服务实例。我已经很久没有使用过这样的工具了,但我对它们所发现的内容感到惊讶(即我不知道存在的一些实例)。 YMMV。您可以搜索详细信息,但我相信此页面具有相关下载:http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

1
SQL Server配置管理器正是我所需要的。快速简便。 - Chris

8

SQL Server允许应用程序在当前网络中查找SQL Server实例。SqlDataSourceEnumerator类向应用程序开发人员公开此信息,提供包含有关所有可见服务器信息的DataTable。此返回表格包含网络上可用的服务器实例列表,该列表与用户尝试创建新连接时提供的列表匹配,并扩展包含Connection Properties对话框上所有可用服务器的下拉列表。显示的结果并非始终完整。 为了检索包含有关可用SQL Server实例信息的表格,您必须首先检索一个枚举器,使用共享/静态Instance属性:

using System.Data.Sql;

class Program
{
  static void Main()
  {
    // Retrieve the enumerator instance and then the data.
    SqlDataSourceEnumerator instance =
      SqlDataSourceEnumerator.Instance;
    System.Data.DataTable table = instance.GetDataSources();

    // Display the contents of the table.
    DisplayData(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
  }

  private static void DisplayData(System.Data.DataTable table)
  {
    foreach (System.Data.DataRow row in table.Rows)
    {
      foreach (System.Data.DataColumn col in table.Columns)
      {
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
      }
      Console.WriteLine("============================");
    }
  }
}

来自 MSDN 的这篇文章介绍了如何使用 Visual Studio 2005 开发高效的 C++ 应用程序。


我需要在这个子网或域上指定吗?它对我来说返回空值,你能更新一下吗? - Transformer
1
对于那些想要使用.NET Core的人来说,SqlDataSourceEnumerator尚未实现,但根据GitHub问题的列表,它将被添加。 - Daniel Hill

8

另外一个选项是运行SQLSERVER发现报告..前往sqlserver的安装媒体,双击setup.exe

enter image description here

接下来,在下一个屏幕中,转到工具并点击如下所示的发现报告

enter image description here

这将展示所有实例及其完整功能。下面是我电脑上的快照。 在此输入图像描述

2
这是获取所有实例的最佳方法。以上所有高票解决方案都无法像这种方法一样提供完整的列表。它甚至显示计算机中安装的MSSQL Express LocalDB版本,即使它与原始问题“实例”无关。 - Dush

6
这个查询应该可以获取服务器名称和实例名称:
SELECT @@SERVERNAME, @@SERVICENAME

4
这只是告诉您与正在执行的查询相关联的当前实例的名称。OP 请求列出所有已安装实例的列表。 - Jay Walker
1
这并没有提供任何关于安装的SQL服务器版本的信息。 - Ahmad

5
如果您想在脚本中确定这一点,可以尝试以下操作:
sc \\server_name query | grep MSSQL

注意:grep是gnuwin32工具的一部分。

3
你可以使用 findstr 替代 grep 来完成这个任务。 - Pablo Montilla
你也可以使用FIND命令,它会导向 **sc \server_name query | FIND "MSSQL"**。 - Julio Nobre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接