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

我试图确定我已经安装(手动或编程)的sql server / sql express的实例,但所有的例子告诉我运行一个SQL查询来确定这假设我已经连接到一个特定的实例。

在命令行中:

SQLCMD -L 

要么

 OSQL -L 

(注:必须是大写L)

这将列出您的networking上安装的所有SQL服务器。 您可以设置一些configuration选项来防止SQL Server在列表中显示。 去做这个…

在命令行:

 svrnetcn 

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

您可以查询此registry值以直接获取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 ++,则可以使用此代码获取registry信息。

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

– 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 

如果您只想查看当前login的计算机上安装的内容,我认为最直接的手动过程是打开SQL Serverconfigurationpipe理器(从“开始”菜单),该pipe理器显示所有SQL服务(和只有 SQL服务)在该硬件(运行与否)。 这假定SQL Server 2005或更高; dotnetengineerbuild议使用服务pipe理控制台将向您显示所有服务,并且应始终可用(例如,如果您正在运行早期版本的SQL Server)。

但是,如果您正在寻找更广泛的查找过程,则可以考虑使用第三方工具(如SQLRecon和SQLPing),它们将扫描您的networking并构build在其有权访问的任何服务器上find的所有SQL服务实例的报告。 自从我使用这样的工具已经有一段时间了,但是我对他们发现的东西感到惊讶(即less数我不知道存在的实例)。 因人而异。 您可能会在Google上查看详细信息,但我相信此页面上有相关的下载内容: http : //www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx

我知道这个post有点旧了,但是在我find我正在寻找的答案之前,我碰到了这个线索,并认为我会分享。 如果您正在使用SQLExpress(或localdb),则有一种更简单的方法来查找您的实例名称。 在命令行中键入:

 > sqllocaldb i 

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

SQL Server允许应用程序在当前networking中查找SQL Server实例。 SqlDataSourceEnumerator类将这些信息公开给应用程序开发人员,提供一个DataTable,其中包含有关所有可见服务器的信息。 此返回的表包含networking上可用的服务器实例列表,该列表与用户尝试创build新连接时提供的列表相匹配,并在“连接属性”对话框中扩展包含所有可用服务器的下拉列表。 显示的结果并不总是完整的。 为了检索包含有关可用SQL Server实例的信息的表,您必须首先使用共享/静态实例属性检索枚举器:

 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

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

 sc \\server_name query | grep MSSQL 

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

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

本地实例由registry项parsing。 远程实例通过UDP广播(端口1434)和SMBparsing。 使用“sqlbrowser.exe -c”列出请求。

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

从Windows命令行键入:

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

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

这当然需要足够的权限。

这个查询应该得到你的服务器名称和实例名称:

 SELECT @@SERVERNAME, @@SERVICENAME 

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

如果你在SSMS内,你可能会发现它更容易使用:

 SELECT @@Version 

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

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

这里是一个简单的方法:去开始然后程序然后Microsoft SQL Server 2005然后configuration工具,然后SQL Serverconfigurationpipe理器,然后SQL Server 2005networkingconfiguration然后在这里,您可以find安装到您的机器上的所有实例。

我知道它的一个旧post,但我find了PoweShell的一个很好的解决scheme,在这里你可以find安装在本地或远程机器上的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}