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

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

678024 次浏览

你可以查询这个注册表值直接得到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++,你可以使用这段代码来获取注册表信息

安装的所有实例都应该显示在Microsoft管理控制台的服务管理单元中。如果需要获取实例名,请执行“开始|运行|类型的服务”。查找所有带有“Sql Server(实例名)”的条目。

在命令行中:

SQLCMD -L

OSQL -L

(注:必须大写L)

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

在命令行:

svrnetcn

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

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

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

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

本地实例由注册表项解析。远程实例通过UDP广播(端口1434)和SMB进行解析。 使用"sqlbrowser.exe -c"列出请求 我的配置使用了1个物理网卡和3个虚拟网卡。 如果我使用"osql -L"命令,sqlbrowser将显示来自一个虚拟适配器(在另一个网段中)的请求,而不是物理适配器。 Osql通过它的度量来选择适配器。你可以通过命令“route print”查看度量值。 对于我的配置,路由表显示虚拟适配器的度量比物理适配器的度量低。所以我在高级网络设置中取消选择自动度量来更改网络属性中的接口度量。 Osql现在使用物理适配器

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

sc \\server_name query | grep MSSQL

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

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

因此,我查看了服务,发现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
SQL Server允许应用程序在当前网络中查找SQL Server实例。SqlDataSourceEnumerator类将此信息公开给应用程序开发人员,提供一个包含所有可见服务器信息的数据表。此返回的表包含网络上可用的服务器实例列表,该列表与用户尝试创建新连接时提供的列表相匹配,并展开“连接属性”对话框中包含所有可用服务器的下拉列表。显示的结果并不总是完整的。 为了检索包含可用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("============================");
}
}
}

from msdn http://msdn.microsoft.com/en-us/library/a6t1z9x2 (v = vs.80) . aspx

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

这个查询可以得到服务器名和实例名:

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);
}

在Windows命令行中输入:

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

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

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

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

SELECT @@Version

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

> sqllocaldb i

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

我知道这是一个老帖子,但我发现了一个很好的解决方案与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}

另一个选择是运行SQLSERVER发现报告,进入SQLSERVER安装介质,双击setup.exe

enter image description here

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

enter image description here

这将向你展示所有的实例以及整个功能..下面是我电脑上的快照 enter image description here < / p >

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

如果你想要一个所有在服务器上实例的列表,并且不喜欢编写脚本或编程,可以这样做:

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

实例应该在“User Name”列中作为MSSQL$INSTANCE_NAME列出。

我从认为这个可怜的服务器正在运行63个实例,到意识到它正在运行3个实例(其中一个在CPU负载方面表现得完全像个恶霸……)

将获得SQL server的实例 reg查询"HKLM\软件\Microsoft\Microsoft SQL Server\实例名\SQL"

. reg查询"HKLM\软件\Microsoft SQL Server\实例名\SQL < p >或使用 SQLCMD - l < / p >