【问题标题】:How to get current instance name from T-SQL如何从 T-SQL 获取当前实例名称
【发布时间】:2013-08-06 20:51:51
【问题描述】:

如何使用 T-SQL 脚本获取当前连接的 SQL Server 服务器和实例名称?

【问题讨论】:

  • 接受的答案是正确的。 SELECT @@SERVERNAME 产生使用sqlcmd -S 连接所需的结果。如果它是默认的 MSSQLSERVER 实例,那么它不能在 -S 参数中指定。这是 2017 年 14.0.2002.14 开发人员版,64 位。

标签: sql sql-server tsql sql-server-2008r2-express


【解决方案1】:

刚刚在this SO question 中找到了答案(字面意思是在问题内部,没有任何答案):

SELECT @@servername

返回 servername\instance 只要这不是默认实例

SELECT @@servicename

返回实例名称,即使这是默认名称 (MSSQLSERVER)

【讨论】:

  • @blasto,这似乎是实例是服务器默认值时的行为。尝试使用命名实例。检查这个:technet.microsoft.com/en-us/library/ms187944.aspx
  • 不正确,使用@@servername 会给你一个错误的答案。 SELECT CONVERT(sysname, SERVERPROPERTY('servername')) 是正确的答案。 @@ServerName 报告 SQL 集群名称,而 serverproperty('servername') 报告 Windows 集群名称。您需要 Windows 集群名称来连接到您的数据库(Windows 集群名称可以与 SQL 集群名称不同;这通常发生在您在另一台机器上安装新的 sql-server 版本时(@@servername = Environment.MachineName)并希望保留旧名称,这样您就不必更改所有配置)。
  • @StefanSteiger 链接的 SO 问题的接受答案表明您提出的解决方案,但 cmets 表明它不适用于某些人。
【解决方案2】:

这个怎么样:

EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                   @key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQl',
                   @value_name='MSSQLSERVER'

这也将获得实例名称。 null 表示默认实例:

SELECT SERVERPROPERTY ('InstanceName')

http://technet.microsoft.com/en-us/library/ms174396.aspx

【讨论】:

  • SELECT SERVERPROPERTY ('InstanceName') 给我一个 NULL。
  • 改为使用 SELECT CONVERT(sysname, SERVERPROPERTY('servername'));
  • @Steam:可能是因为它是默认实例。
【解决方案3】:

SELECT @@servername 将为您提供server/instanceName 的数据

要仅获取 instanceName,您应该运行 select @@ServiceName 查询。

【讨论】:

  • 首先,斜线的方式错误。正确的形式是“服务器\实例”。其次,@@servername 并不总是会给你服务器和实例,因为当只有一个实例时,它只会返回“服务器”。
【解决方案4】:

为什么只停留在实例名称上?您可以使用以下方法清点您的 SQL Server 环境:

SELECT  
    SERVERPROPERTY('ServerName') AS ServerName,  
    SERVERPROPERTY('MachineName') AS MachineName,
    CASE 
        WHEN  SERVERPROPERTY('InstanceName') IS NULL THEN ''
        ELSE SERVERPROPERTY('InstanceName')
    END AS InstanceName,
    '' as Port, --need to update to strip from Servername. Note: Assumes Registered Server is named with Port
    SUBSTRING ( (SELECT @@VERSION),1, CHARINDEX('-',(SELECT @@VERSION))-1 ) as ProductName,
    SERVERPROPERTY('ProductVersion') AS ProductVersion,  
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('ProductMajorVersion') AS ProductMajorVersion,
    SERVERPROPERTY('ProductMinorVersion') AS ProductMinorVersion,
    SERVERPROPERTY('ProductBuild') AS ProductBuild,
    SERVERPROPERTY('Edition') AS Edition,
    CASE SERVERPROPERTY('EngineEdition')
        WHEN 1 THEN 'PERSONAL'
        WHEN 2 THEN 'STANDARD'
        WHEN 3 THEN 'ENTERPRISE'
        WHEN 4 THEN 'EXPRESS'
        WHEN 5 THEN 'SQL DATABASE'
        WHEN 6 THEN 'SQL DATAWAREHOUSE'
    END AS EngineEdition,  
    CASE SERVERPROPERTY('IsHadrEnabled')
        WHEN 0 THEN 'The Always On Availability Groups feature is disabled'
        WHEN 1 THEN 'The Always On Availability Groups feature is enabled'
        ELSE 'Not applicable'
    END AS HadrEnabled,
    CASE SERVERPROPERTY('HadrManagerStatus')
        WHEN 0 THEN 'Not started, pending communication'
        WHEN 1 THEN 'Started and running'
        WHEN 2 THEN 'Not started and failed'
        ELSE 'Not applicable'
    END AS HadrManagerStatus,
    CASE SERVERPROPERTY('IsSingleUser') WHEN 0 THEN 'No' ELSE 'Yes' END AS InSingleUserMode,
    CASE SERVERPROPERTY('IsClustered')
        WHEN 1 THEN 'Clustered'
        WHEN 0 THEN 'Not Clustered'
        ELSE 'Not applicable'
    END AS IsClustered,
    '' as ServerEnvironment,
    '' as ServerStatus,
    '' as Comments

【讨论】:

  • 好东西 Nate,我有一个类似的更增强的 Inventory 脚本也在做同样的事情。通过电子邮件与我联系以获取副本...此线程的脚本将失去焦点。
【解决方案5】:

我发现了这个:

EXECUTE xp_regread
        @rootkey = 'HKEY_LOCAL_MACHINE',
        @key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
        @value_name = 'InstalledInstances'

这将为您提供服务器中安装的所有实例的列表。


SERVERPROPERTY 函数的ServerName 属性和@@SERVERNAME 返回相似的信息。 ServerName 属性提供共同构成唯一服务器实例的 Windows 服务器和实例名称。 @@SERVERNAME 提供当前配置的本地服务器名称。

当前服务器的 Microsoft 示例是:

SELECT CONVERT(sysname, SERVERPROPERTY('servername'));

当 Windows 服务器上安装了多个 SQL Server 实例并且客户端必须打开另一个连接到当前连接使用的同一实例时,此方案很有用。

【讨论】:

  • SELECT CONVERT(sysname, SERVERPROPERTY('servername'));是正确的答案
【解决方案6】:

获取您连接的服务器和实例的列表:

select * from Sys.Servers

获取已连接服务器拥有的数据库列表:

SELECT * from sys.databases;

【讨论】:

    【解决方案7】:

    只是为了向注册表查询添加一些说明。它们只列出当前实例的匹配位数(32 或 64)的实例。

    64 位操作系统上 32 位 SQL 实例的实际注册表项是:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
    

    您也可以在 64 位实例上查询它以获取所有 32 位实例。 32 位实例似乎仅限于 Wow6432Node,因此无法读取 64 位注册表树。

    【讨论】:

      【解决方案8】:

      另一种查找实例名称的方法-右键单击数据库名称并选择属性,在这部分您可以在左下角看到查看连接属性,单击它可以看到实例名称。

      【讨论】:

        猜你喜欢
        • 2013-08-22
        • 2019-02-28
        • 2010-09-12
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        相关资源
        最近更新 更多