我正在尝试确定我已安装了哪些sql server / sql express实例(手动或以编程方式),但是所有示例都告诉我运行SQL查询来确定这一点,并假设我已经连接到特定实例。
我正在尝试确定我已安装了哪些sql server / sql express实例(手动或以编程方式),但是所有示例都告诉我运行SQL查询来确定这一点,并假设我已经连接到特定实例。
Answers:
在命令行中:
SQLCMD -L
要么
OSQL -L
(注意:必须为大写L)
这将列出网络上安装的所有sql服务器。您可以设置一些配置选项,以防止SQL Server显示在列表中。去做这个...
在命令行中:
svrnetcn
在启用的协议列表中,选择“ TCP / IP”,然后单击属性。有一个“隐藏服务器”复选框。
C:\> sqllocaldb i
您可以查询此注册表值以直接获取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(实例名称)”的所有条目。
Get-Service | ?{ $_.Name -like "MSSQL*" }
-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
不是吗?
我知道这个线程有点旧,但是在找到想要的答案并认为自己会分享之前,我遇到了这个线程。如果使用的是SQLExpress(或localdb),则有一种更简单的方法来查找实例名称。在命令行中输入:
> sqllocaldb i
这将列出您在本地安装的实例名称。因此,您的完整服务器名称应在实例名称之前包含(localdb)\以进行连接。另外,sqllocaldb允许您创建新实例或删除它们以及对其进行配置。请参阅:SqlLocalDB Utility。
如果您只想查看当前登录到的计算机上已安装了什么,我认为最直接的手动过程是打开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
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
SQL Server浏览器服务http://msdn.microsoft.com/zh-cn/library/ms181087.aspx
如果您有兴趣在脚本中确定此内容,可以尝试以下操作:
sc \\server_name query | grep MSSQL
注意:grep是gnuwin32工具的一部分
findstr
代替使用grep
。
在Windows命令行中,键入:
SC \\server_name query | find /I "SQL Server ("
其中“ server_name”是要在其上显示SQL实例的任何远程服务器的名称。
当然,这需要足够的权限。
此查询应为您获取服务器名称和实例名称:
SELECT @@SERVERNAME, @@SERVICENAME
我有同样的问题。“ osql -L”命令仅显示服务器列表,但没有实例名称(仅显示我本地SQL Sever的实例)。使用Wireshark的sqlbrowser.exe(可以在SQL安装的共享文件夹中找到),找到了解决我的问题的方法。
本地实例通过注册表项解析。远程实例通过UDP广播(端口1434)和SMB进行解析。使用“ sqlbrowser.exe -c”列出请求。
我的配置使用1个物理和3个虚拟网络适配器。如果我使用“ osql -L”命令,则sqlbrowser显示来自一个虚拟适配器(位于另一个网段)的请求,而不是来自物理适配器的请求。osql通过其指标选择adpater。您可以使用“ route print”命令查看指标。对于我的配置,路由表显示的虚拟适配器的度量标准比物理适配器的度量标准低。因此,我通过在高级网络设置中取消选择自动度量来更改网络属性中的接口度量。osql现在使用物理适配器。
当我评估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);
}
我知道它的文章很旧,但是我发现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}