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


224

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


1
这是一个如何使用sqlcmd进行标识的链接msdn.microsoft.com/zh-cn/library/ms165662%28v=sql.90%29.aspx

如何查找您的SQL Server实例(服务器名称)和版本 youtube.com/watch?v=DLrxFXXeLFk
mloskot 2014年

您能告诉我您正在谈论的SQL查询吗?
LearnByReading

1
@LearnByReading请参阅下面的穆罕默德·伊夫特卡·艾哈迈德(Mohammed Ifteqar Ahmed)的答案。
路加福音

2
您可以查询注册表:pmichaels.net/2016/02/12/…–
Paul Michaels

Answers:


209

在命令行中:

SQLCMD -L

要么

OSQL -L

(注意:必须为大写L)

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

在命令行中:

svrnetcn

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


2
我喜欢命令行选项,但是在(非联网的)开发人员盒中尝试它们时,结果却参差不齐。基本上,只有在运行SQL Server浏览器服务的情况下,“ sqlcmd -L”才是唯一有效的命令。这是可以预期的吗?
马特

当它简单而直截了当时,我喜欢它。我一直在努力寻找要为Amazon Web Service SQL Server实例输入的正确服务器名称。ThanX
Mehdi LAMRANI 2011年

1
不错的命令,但是由于某种原因,它在计算出的网络上检测到SQLExpress实例,但未能在本地计算机上检测到SQLExpress实例。
2015年

1
@sparebytes:原因在这里:dba.stackexchange.com/questions/18499/…–
DonBecker

试试:C:\> sqllocaldb i
Contango

82

您可以查询此注册表值以直接获取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ГеннадийВанин10年

谢谢,查询对我有用。我有一台机器,想知道默认实例和SQL Express实例,它们分别是2008和2008 R2。我连接到每个实例并运行查询,然后得到了版本号。谷歌搜索然后很容易。
Meligy 2010年

3
请注意,“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <版本> \ Tools \ ClientSetup \ CurrentVersion”和“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \实例名称”似乎显示在注册表,而实例的实际路径:“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ <instancename>”显示在64位Hive中。
NGaida

注册表是已安装软件的源定义。您的解决方案使我可以直接使用源代码,而不是使用最终使用注册表值的CLI工具或也使用注册表的MMC管理单元。完美
barrypicker

76

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


13
等效的PowerShell命令:Get-Service | ?{ $_.Name -like "MSSQL*" }
orad 2014年

2
我的电脑显示MSSQL $ SQLEXPRESS正在使用显示名称SQL Server(SQLEXPRESS)...运行,但是如何在服务器名称中输入此名称?测试连接显示错误,例如...尝试连接到SQL Server时发生了与网络相关或特定于实例的错误
webzy

47

-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 2012年

3
+1有关实例的信息的来源与Brian的答案相同。有人可能会编写C#代码来从Windows注册表中获取值。这让我觉得答案暂时是多余的,但是很高兴知道xp_regread。#谢谢。
Mzn 2014年

查询结果仅是实例名称,是否可以为结果添加每个实例的兼容性级别?
Marwan Almukh

16

我知道这个线程有点旧,但是在找到想要的答案并认为自己会分享之前,我遇到了这个线程。如果使用的是SQLExpress(或localdb),则有一种更简单的方法来查找实例名称。在命令行中输入:

> sqllocaldb i

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


11

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

但是,如果您正在寻找更广泛的发现过程,则可以考虑使用第三方工具(例如SQLRecon和SQLPing),这些工具将扫描您的网络并生成在它们有权访问的任何服务器上找到的所有SQL Service实例的报告。自从我使用这样的工具已经有一段时间了,但是我对它们的发现感到惊讶(即,有一些我不知道的实例)。YMMV。您可以通过Google获得详细信息,但我认为该页面具有相关下载:http : //www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx


1
SQL Server配置管理器正是我所需要的。快捷方便。
克里斯(Chris

8

SQL Server允许应用程序在当前网络中查找SQL Server实例。SqlDataSourceEnumerator类向应用程序开发人员公开此信息,从而提供一个包含有关所有可见服务器信息的DataTable。此返回的表包含网络上可用的服务器实例的列表,该列表与用户尝试创建新连接时提供的列表相匹配,并在“连接属性”对话框上展开包含所有可用服务器的下拉列表。显示的结果并不总是完整的。为了检索包含有关可用SQL Server实例信息的表,必须首先使用shared / static 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


我是否需要在该域或域上指定一​​个子网,它对我来说又为空,请您更新一下
变压器

1
对于那些希望使用.NET Core的用户,SqlDataSourceEnumerator尚未实现,但根据GitHub问题将其添加到列表中。
丹尼尔·希尔



5

在Windows命令行中,键入:

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

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

当然,这需要足够的权限。


在运行2008 R2并运行多个Express和LocalDB实例的开发机上无法正常工作。
Christoph'Sep

4

此查询应为您获取服务器名称和实例名称:

SELECT @@SERVERNAME, @@SERVICENAME

3
这只会告诉您与正在执行的查询关联的当前实例的名称。OP要求提供所有已安装实例的列表
Jay Walker 2014年

1
它不提供有关安装哪个版本的SQL Server的任何信息
Ahmad

2

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

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

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


2

另一种选择是运行SQLSERVER发现report..go到sqlserver的安装媒体,然后双击setup.exe

在此处输入图片说明

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

在此处输入图片说明

这将向您显示所有实例以及所有功能..以下是我电脑上的快照 在此处输入图片说明


1

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

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


1

当我评估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);
                    }

0

这是一个简单的方法:依次转到“开始”,“程序”,“ Microsoft SQL Server 2005”,“配置工具”,“ SQL Server配置管理器”,“ SQL Server 2005网络配置”,然后在这里可以找到安装到计算机上的所有实例。


0

我知道它的文章很旧,但是我发现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()
Darryl Wilson

0

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

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

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

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

而且我从认为性能不佳的服务器正在运行63个实例,转而意识到它正在运行3个实例(其中一个实例表现得像是CPU负载的总欺负者……)


0

将获取SQL Server reg查询的实例“ HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL”

或使用SQLCMD -L


-1

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

SELECT @@Version

3
问题本身表明他们不想/无法使用SQL查询来确定版本
Trotski94
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.