Как получить текущее имя экземпляра из T-SQL


90

Как я могу получить сервер SQL Server и имя экземпляра текущего соединения с помощью сценария T-SQL?


Принятый ответ правильный. SELECT @@SERVERNAMEдает результат, необходимый для подключения с помощью sqlcmd -S. Если это экземпляр MSSQLSERVER по умолчанию, то его нельзя указывать в параметре -S. Это версия для разработчиков 14.0.2002.14 2017, 64-разрядная версия.
загорелся

Ответы:


166

Только что нашел ответ в этом SO-вопросе (буквально, внутри вопроса, а не ответа):

SELECT @@servername

возвращает имя сервера \ экземпляр, если это не экземпляр по умолчанию

SELECT @@servicename

возвращает имя экземпляра, даже если это значение по умолчанию (MSSQLSERVER)


1
@blasto, похоже, это поведение, когда экземпляр по умолчанию на сервере. Попробуйте использовать именованный экземпляр. Проверьте это: technet.microsoft.com/en-us/library/ms187944.aspx
Гильермо Гутьеррес

10
Неправильно, использование @@ servername может дать вам неправильный ответ. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) - правильный ответ. @@ ServerName сообщает имя кластера SQL, а serverproperty ('servername') сообщает имя кластера Windows. Для подключения к базе данных вам потребуется имя кластера Windows (имя кластера Windows может отличаться от имени кластера SQL; обычно это происходит, когда вы устанавливаете новую версию sql-сервера на другой компьютер (@@ servername = Environment.MachineName) и хотите сохранить старое имя, чтобы вам не пришлось менять все конфигурации).
Стефан Штайгер

1
@StefanSteiger Принятый ответ на связанный вопрос SO указывает на решение, которое вы представили, но в комментариях указано, что оно не работает для некоторых людей.
Trisped

17

Как насчет этого:

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


10
SELECT SERVERPROPERTY ('InstanceName') дает мне NULL.
Steam

4
вместо этого используйте SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Стефан Штайгер

1
@Steam: Наверное, потому что это экземпляр по умолчанию.
Стефан Штайгер

10

SELECT @@servername предоставит вам данные как server/instanceName

Чтобы получить только те, instanceNameвам нужно выполнить select @@ServiceNameзапрос.


Во-первых, у вас неправильная косая черта. Правильная форма - «сервер \ экземпляр». Во-вторых, не всегда верно, что @@ servername предоставит вам и сервер, и экземпляр, потому что, когда есть только один экземпляр, он вернет только «сервер».
Робиньо

8

Я нашел это:

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

Это даст вам список всех экземпляров, установленных на вашем сервере.


ServerNameСвойство SERVERPROPERTYфункции и @@SERVERNAMEвозвращать подобную информацию. ServerNameСвойство обеспечивает сервера и имя экземпляра Windows , которые вместе составляют уникальный экземпляр сервера. @@SERVERNAMEпредоставляет текущее настроенное имя локального сервера.

И пример Microsoft для текущего сервера:

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

Этот сценарий полезен, когда на сервере Windows установлено несколько экземпляров SQL Server, и клиент должен открыть другое соединение с тем же экземпляром, который используется текущим подключением.


ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (sysname, SERVERPROPERTY ('servername')); правильный ответ
Стефан Штайгер

8

Зачем останавливаться только на имени экземпляра? Вы можете провести инвентаризацию своей среды 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

1
Хорошо, Нейт, у меня есть похожий, более усовершенствованный скрипт инвентаризации, делающий то же самое. свяжитесь со мной для получения копии по электронной почте ... Сценарий будет не в фокусе для этой темы.
Хэнк Фриман

2

Чтобы получить список серверов и экземпляров, к которым вы подключены:

select * from Sys.Servers

Чтобы получить список баз данных, которые есть на подключенном сервере:

SELECT * from sys.databases;

1

Просто чтобы добавить некоторые пояснения к запросам реестра. Они перечисляют только экземпляры совпадающей разрядности (32 или 64) для текущего экземпляра.

Фактический ключ реестра для 32-битных экземпляров SQL в 64-битной ОС:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Вы можете запросить это в 64-битном экземпляре, чтобы получить все 32-битные экземпляры. 32-разрядный экземпляр, похоже, ограничен Wow6432Node, поэтому не может читать 64-разрядное дерево реестра.


0

Другой способ найти имя экземпляра - щелкните правой кнопкой мыши имя базы данных и выберите «Свойства», в этой части вы можете увидеть свойства соединения в левом нижнем углу, щелкните по нему, затем вы увидите имя экземпляра.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.