【问题标题】:How can I determine installed SQL Server instances and their versions?如何确定已安装的 SQL Server 实例及其版本?
【发布时间】:2010-09-13 13:24:53
【问题描述】:

我正在尝试确定我已经安装了哪些 sql server/sql express 实例(手动或以编程方式),但所有示例都告诉我运行 SQL 查询以确定假设我已经连接到一个特定的实例。

【问题讨论】:

标签: sql-server sql-server-express


【解决方案1】:

在命令行:

SQLCMD -L

OSQL -L

(注意:必须是大写的L)

这将列出您网络上安装的所有 sql 服务器。您可以设置一些配置选项来阻止 SQL Server 显示在列表中。为此...

在命令行:

svrnetcn

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

【讨论】:

  • 我喜欢命令行选项,但是当我在我的(非联网的)开发人员机器上尝试它们时得到的结果好坏参半;基本上“sqlcmd -L”是唯一有效的,并且只有在 SQL Server Browser 服务正在运行时。这是意料之中的吗?
  • 我喜欢它简单而直接。我一直在努力寻找正确的服务器名称来输入 Amazon Web Service SQL Server 实例。比X
  • 不错的命令,但由于某种原因,它在计算的网络上检测到 SQLExpress 实例,但未能在我的本地计算机上检测到 SQLExpress 实例。
  • @sparebytes: 原因在这里:dba.stackexchange.com/questions/18499/…
  • 试试:C:\> sqllocaldb i
【解决方案2】:

您可以查询此注册表值以直接获取 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')

If you are using C++ you can use this code to get the registry information.

【讨论】:

  • ('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') 只显示服务器,只运行一个但不运行实例或安装但停止的服务器
  • 谢谢,这个查询对我有用。我有一台机器,想知道 2008 和 2008 R2 的默认实例和 SQL Express 实例。我连接到每个实例并运行查询,它给了我一个版本号。用谷歌搜索数字很容易。
  • 注意,它看起来像 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\\Tools\ClientSetup\CurrentVersion" 和 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names"显示在注册表的 32 位部分,而实例的实际路径:“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\”显示在 64 位 Hive 中。
  • 注册表是已安装软件的源定义。您的解决方案允许我直接访问源代码,而不是使用最终使用注册表值的 CLI 工具或也使用注册表的 MMC 管理单元。完美
【解决方案3】:

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

【讨论】:

  • 等效的 PowerShell 命令:Get-Service | ?{ $_.Name -like "MSSQL*" }
  • 我的电脑显示 MSSQL$SQLEXPRESS 正在以显示名称 SQL Server (SQLEXPRESS) 运行....但是我如何在服务器名称中输入它?测试连接显示错误,例如...尝试连接到 sql server 时发生网络相关或实例特定错误
【解决方案4】:

-- 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 不是吗?
  • +1 实例信息的来源与 Brian 的回答相同。有人不妨编写 C# 代码从 Windows 注册表中获取值;这让我觉得答案暂时是多余的,但很高兴了解 xp_regread。 #谢谢。
  • 查询结果仅为实例名称,是否可以将每个实例的兼容性级别添加到结果中?
  • 这不会区分与 SQL Server 完整版和快速版关联的实例
【解决方案5】:

我知道这个帖子有点老了,但我在找到我正在寻找的答案并认为我会分享之前就遇到了这个帖子。如果您使用的是 SQLExpress(或 localdb),则有一种更简单的方法可以找到您的实例名称。 在命令行输入:

> sqllocaldb i

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

【讨论】:

    【解决方案6】:

    如果您只想查看当前登录的计算机上安装了什么,我认为最直接的手动过程就是打开 SQL Server 配置管理器(从“开始”菜单),它会显示所有 SQL该硬件(运行与否)上的服务(以及 SQL 服务)。这假定 SQL Server 2005 或更高版本; dotnetengineer 建议使用服务管理控制台将向您显示所有服务,并且应该始终可用(例如,如果您运行的是早期版本的 SQL Server)。

    但是,如果您正在寻找更广泛的发现过程,则可以考虑使用 SQLRecon 和 SQLPing 等第三方工具,它们将扫描您的网络并生成一份报告,其中包含在它们拥有的任何服务器上发现的所有 SQL 服务实例使用权。自从我使用这样的工具已经有一段时间了,但我对他们的发现感到惊讶(即,少数我不知道存在的实例)。 YMMV。你可以谷歌了解详情,但我相信这个页面有相关的下载:http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

    【讨论】:

    • SQL Server 配置管理器正是我所需要的。快速简单。
    【解决方案7】:

    SQL Server 允许应用程序在当前网络中查找 SQL Server 实例。 SqlDataSourceEnumerator 类将此信息公开给应用程序开发人员,提供包含有关所有可见服务器的信息的 DataTable。此返回的表包含网络上可用的服务器实例列表,该列表与用户尝试创建新连接时提供的列表相匹配,并在“连接属性”对话框中展开包含所有可用服务器的下拉列表。显示的结果并不总是完整的。 为了检索包含有关可用 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 http://msdn.microsoft.com/en-us/library/a6t1z9x2(v=vs.80).aspx

    【讨论】:

    • 我需要在这个或域上指定一​​个子网吗,它对我来说是空的,你能更新一下吗
    • 对于那些希望使用 .NET Core 的用户,SqlDataSourceEnumerator 尚未实现,但已根据 GitHub issue 在列表中添加。
    【解决方案8】:

    【讨论】:

    • 哎呀...从通常的位置缺少 sqlbrowser.exe!我必须拥有 Microsoft 版本(即无法使用的版本):-) 开玩笑 - 我们都爱微软,几乎和我岳母一样爱。
    【解决方案9】:

    此查询应该为您提供服务器名称和实例名称:

    SELECT @@SERVERNAME, @@SERVICENAME
    

    【讨论】:

    • 这仅告诉您与正在执行的查询关联的当前实例的名称。 OP 请求了所有已安装实例的列表
    • 这不提供有关安装了哪个版本的 SQL Server 的任何信息
    【解决方案10】:

    如果您有兴趣在脚本中确定这一点,可以尝试以下方法:

    sc \\server_name query | grep MSSQL
    

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

    【讨论】:

    • 您可以使用findstr 而不是grep
    • 你也可以使用,FIND,这会导致sc \\server_name query |查找“MSSQL”
    【解决方案11】:

    在 Windows 命令行中,键入:

    SC \\server_name query | find /I "SQL Server ("
    

    其中“server_name”是您希望在其上显示 SQL 实例的任何远程服务器的名称。

    这当然需要足够的权限。

    【讨论】:

    • 在我的开发机器上不工作,它有 2008 R2 和多个 Express 和 LocalDB 实例正在运行。
    【解决方案12】:

    另一种选择是运行 SQLSERVER 发现报告..转到 sqlserver 的安装介质并双击 setup.exe

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

    这将向您展示所有存在的实例以及全部功能。以下是我电脑上的快照

    【讨论】:

    • 这是获取所有实例的最佳方式。上述高票解决方案都不能像这种方法一样给出完整的列表。它甚至显示安装在计算机中的 MSSQL Express LocalDB 版本,即使它与关于“实例”的原始问题无关。
    • 感谢@Dush 提供的信息
    【解决方案13】:

    我遇到了同样的问题。 “osql -L”命令仅显示服务器列表,但没有实例名称(仅显示我的本地 SQL Sever 的实例)。 使用 Wireshark、sqlbrowser.exe(可以在 SQL 安装的共享文件夹中找到)我找到了解决问题的方法。

    本地实例由注册表项解析。远程实例由 UDP 广播(端口 1434)和 SMB 解析。 使用“sqlbrowser.exe -c”列出请求。

    我的配置使用 1 个物理网络适配器和 3 个虚拟网络适配器。 如果我使用“osql -L”命令,sqlbrowser 会显示来自其中一个虚拟适配器(位于另一个网段中)的请求,而不是物理适配器。 osql 通过其度量选择适配器。您可以使用“路由打印”命令查看指标。 对于我的配置,路由表显示虚拟适配器的指标低于物理适配器。因此,我通过取消选择高级网络设置中的自动指标来更改网络属性中的接口指标。 osql 现在使用物理适配器。

    【讨论】:

      【解决方案14】:

      我刚刚安装了 Sql server 2008,但我无法连接到任何数据库实例。 @G Mastros 发布的命令未列出任何活动实例。

      所以我查看了服务,发现 SQL Server 代理已禁用。我通过将其设置为自动然后启动它来修复它。

      【讨论】:

        【解决方案15】:

        我在评估 100 多台服务器时遇到了同样的问题,我有一个用 C# 编写的脚本来浏览由 SQL 组成的服务名称。在服务器上安装实例时,SQL Server 会为每个实例添加一个带有服务名称的服务。对于 2000 到 2008 等不同版本,它可能会有所不同,但可以肯定的是,有一个带有实例名称的服务。

        我获取服务名称并从服务名称中获取实例名称。以下是用于 WMI 查询结果的示例代码:

        if (ServiceData.DisplayName == "MSSQLSERVER" || ServiceData.DisplayName == "SQL Server (MSSQLSERVER)")
                    {
                        InstanceData.Name = "DEFAULT";
                        InstanceData.ConnectionName = CurrentMachine.Name;
                        CurrentMachine.ListOfInstances.Add(InstanceData);
                    }
                    else
                        if (ServiceData.DisplayName.Contains("SQL Server (") == true)
                        {
                            InstanceData.Name = ServiceData.DisplayName.Substring(
                                                    ServiceData.DisplayName.IndexOf("(") + 1,
                                                    ServiceData.DisplayName.IndexOf(")") - ServiceData.DisplayName.IndexOf("(") - 1
                                                );
                            InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                            CurrentMachine.ListOfInstances.Add(InstanceData);
                        }
                        else
                            if (ServiceData.DisplayName.Contains("MSSQL$") == true)
                            {
                                InstanceData.Name = ServiceData.DisplayName.Substring(
                                                        ServiceData.DisplayName.IndexOf("$") + 1,
                                                        ServiceData.DisplayName.Length - ServiceData.DisplayName.IndexOf("$") - 1
                                                    );
        
                                InstanceData.ConnectionName = CurrentMachine.Name + "\\" + InstanceData.Name;
                                CurrentMachine.ListOfInstances.Add(InstanceData);
                            }
        

        【讨论】:

          【解决方案16】:

          OSQL -LSQLCMD -L 命令将显示网络上的所有实例

          如果您想要服务器上的所有实例的列表,并且不想编写脚本或编程,请执行以下操作:

          1. 启动 Windows 任务管理器
          2. 勾选“显示所有用户的进程”或同等复选框
          3. 按“图像名称”对进程进行排序
          4. 找到所有sqlsrvr.exe 图片

          实例应在“用户名”列中列为MSSQL$INSTANCE_NAME

          我从认为糟糕的服务器运行 63 个实例开始意识到它正在运行三个实例(其中一个在 CPU 负载下表现得像个恶霸......)

          【讨论】:

            【解决方案17】:

            将获取 SQL server 的实例 reg query "HKLM\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL"

            或使用 SQLCMD -L

            【讨论】:

            • 有趣的是,只有注册表查询方法对我有用。
            【解决方案18】:

            这是一个简单的方法: 去 那就开始吧 然后程序 Microsoft SQL Server 2005 然后 然后是配置工具 SQL Server 配置管理器然后 SQL Server 2005 网络配置然后 在这里您可以找到安装在您机器上的所有实例。

            【讨论】:

              【解决方案19】:

              我知道这是一篇旧帖子,但我找到了一个很好的 PoweShell 解决方案,您可以在其中找到安装在本地或远程计算机上的 SQL 实例,包括该版本,还可以扩展获取其他属性。

              $MachineName = ‘.’ # Default local computer Replace . with server name for a remote computer
              
              $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $MachineName)
              $regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL" )
              $values = $regkey.GetValueNames()
              $values | ForEach-Object {$value = $_ ; $inst = $regKey.GetValue($value); 
                            $path = "SOFTWARE\\Microsoft\\Microsoft SQL Server\\"+$inst+"\\MSSQLServer\\"+"CurrentVersion";
                            #write-host $path; 
                            $version = $reg.OpenSubKey($path).GetValue("CurrentVersion");
                                        write-host "Instance" $value;
                            write-host  "Version" $version}
              

              【讨论】:

              • 嗨,这很好,我可以将它包装在 C# 类中还是如何从代码中调用它
              • 嗨。这是我第一次尝试 powershell,因此将不胜感激。如果我尝试运行此脚本,我会收到以下错误。 Aldo 这会找到所有远程 sql 服务器吗?我正在尝试编译 SQL Server 及其数据库的列表。您不能在空值表达式上调用方法。 + $values = $regkey.GetValueNames()
              【解决方案20】:

              如果您在 SSMS 中,您可能会发现它更易于使用:

              SELECT @@Version
              

              【讨论】:

              • 问题本身表明他们不想/不能使用 SQL 查询来确定版本
              猜你喜欢
              • 2017-05-30
              • 2011-02-12
              • 1970-01-01
              • 1970-01-01
              • 2018-05-17
              • 1970-01-01
              • 2012-10-08
              相关资源
              最近更新 更多