我正在尝试确定我已经安装了哪些 sql server/sql express 实例(手动或以编程方式),但所有示例都告诉我运行 SQL 查询以确定假设我已经连接到特定实例.
20 回答
在命令行:
SQLCMD -L
或者
OSQL -L
(注:必须是大写L)
这将列出您网络上安装的所有 sql 服务器。您可以设置一些配置选项来阻止 SQL Server 显示在列表中。去做这个...
在命令行:
svrnetcn
在启用的协议列表中,选择“TCP/IP”,然后单击属性。有一个“隐藏服务器”复选框。
您可以查询此注册表值以直接获取 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')
所有安装的实例都应显示在 Microsoft 管理控制台的服务管理单元中。要获取实例名称,请转到开始 | 运行 | 键入 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
我知道这个线程有点老了,但是在我找到我正在寻找的答案并认为我会分享之前,我遇到了这个线程。如果您使用的是 SQLExpress(或 localdb),则有一种更简单的方法可以找到您的实例名称。在命令行类型:
> sqllocaldb i
这将列出您在本地安装的实例名称。因此,您的完整服务器名称应在要连接的实例名称前包含 (localdb)\。此外,sqllocaldb 允许您创建新实例或删除它们以及配置它们。请参阅:SqlLocalDB 实用程序。
如果您只想查看当前登录的计算机上安装了什么,我认为最直接的手动过程是打开 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 允许应用程序在当前网络中查找 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
SQL Server 浏览器服务http://msdn.microsoft.com/en-us/library/ms181087.aspx
如果您有兴趣在脚本中确定这一点,可以尝试以下操作:
sc \\server_name query | grep MSSQL
注意:grep 是 gnuwin32 工具的一部分
此查询应该为您提供服务器名称和实例名称:
SELECT @@SERVERNAME, @@SERVICENAME
在 Windows 命令行中,键入:
SC \\server_name query | find /I "SQL Server ("
其中“server_name”是您希望在其上显示 SQL 实例的任何远程服务器的名称。
这当然需要足够的权限。
我有同样的问题。“osql -L”命令仅显示服务器列表但没有实例名称(仅显示我的本地 SQL Sever 的实例)。使用 Wireshark、sqlbrowser.exe(可以在 SQL 安装的共享文件夹中找到),我找到了解决问题的方法。
本地实例由注册表项解析。远程实例由 UDP 广播(端口 1434)和 SMB 解析。使用“sqlbrowser.exe -c”列出请求。
我的配置使用 1 个物理网络适配器和 3 个虚拟网络适配器。如果我使用“osql -L”命令,sqlbrowser 会显示来自其中一个虚拟适配器(位于另一个网段中)的请求,而不是物理适配器。osql 通过其度量选择适配器。您可以使用“路由打印”命令查看指标。对于我的配置,路由表显示虚拟适配器的指标低于物理适配器。因此,我通过取消选择高级网络设置中的自动指标来更改网络属性中的接口指标。osql 现在使用物理适配器。
我刚刚安装了 Sql server 2008,但我无法连接到任何数据库实例。@G Mastros 发布的命令未列出任何活动实例。
所以我查看了服务,发现 SQL Server 代理被禁用了。我通过将其设置为自动然后启动它来修复它。
我在评估 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);
}
这些命令将向您显示网络上的OSQL -L
所有实例。SQLCMD -L
如果您想获得服务器上所有实例的列表并且不想编写脚本或编程,请执行以下操作:
- 启动 Windows 任务管理器
- 勾选复选框“显示所有用户的进程”或等效项
- 按“图像名称”对进程进行排序
- 找到所有
sqlsrvr.exe
图像
实例应在“用户名”列中列为MSSQL$INSTANCE_NAME
.
而且我从认为糟糕的服务器运行 63 个实例到意识到它正在运行三个实例(其中一个在 CPU 负载下表现得像一个完全的恶霸......)
将获取 SQL server reg query "HKLM\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL" 的实例
或使用 SQLCMD -L
这是一个简单的方法:依次转到开始、程序、Microsoft SQL Server 2005、配置工具、SQL Server 配置管理器、SQL Server 2005 网络配置,然后在这里您可以找到安装在您机器上的所有实例。
我知道这是一篇旧文章,但我找到了 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}
如果您在 SSMS 中,您可能会发现它更易于使用:
SELECT @@Version