Як отримати поточне ім'я екземпляра з T-SQL


90

Як я можу отримати сервер SQL Server та ім'я екземпляра поточного з'єднання, використовуючи скрипт T-SQL?


Прийнята відповідь є правильною. SELECT @@SERVERNAMEдає результат, необхідний для підключення за допомогою sqlcmd -S. Якщо це екземпляр MSSQLSERVER за замовчуванням, тоді він повинен бути -не вказаний у параметрі -S. Це версія для розробників, 14.0.2002.14, 64-розрядна.
запалено

Відповіді:


166

Щойно знайшов відповідь у цьому запитанні SO (буквально всередині питання, а не будь-яка відповідь):

SELECT @@servername

повертає ім'я сервера \ екземпляр, наскільки це не екземпляр за замовчуванням

SELECT @@servicename

повертає ім'я екземпляра, навіть якщо це за замовчуванням (MSSQLSERVER)


1
@blasto, здається, це поведінка, коли екземпляр є типовим на сервері. Спробуйте з іменованим екземпляром. Перевірте це: technet.microsoft.com/en-us/library/ms187944.aspx
Гільєрмо Гутьєррес

10
Неправильно, використання @@name сервера може дати вам неправильну відповідь. SELECT CONVERT (ім'я користувача, SERVERPROPERTY ('ім'я сервера')) - правильна відповідь. @@ ServerName повідомляє ім'я кластера SQL, тоді як serverproperty ('ім'я сервера') повідомляє ім'я кластера Windows. Вам потрібно ім’я кластера Windows для підключення до вашого db (ім’я кластера Windows може відрізнятися від імені кластера SQL; Це зазвичай трапляється, коли ви інсталюєте нову версію SQL-сервера на іншій машині (@@ servername = Environment.MachineName) і хочете зберегти стару назву, щоб вам не довелося змінювати всі конфігурації).
Stefan Steiger

1
@StefanSteiger Прийнята відповідь на зв’язане запитання SO вказує на рішення, яке ви представили, але коментарі вказують, що воно не працює для деяких людей.
Триспід

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') дає мені НУЛЬ.
Steam

4
замість цього використовуйте SELECT CONVERT (ім'я користувача, SERVERPROPERTY ('ім'я сервера'));
Stefan Steiger

1
@Steam: Можливо, тому, що це екземпляр за замовчуванням.
Stefan Steiger

10

SELECT @@servername дасть вам дані як server/instanceName

Щоб отримати лише запит, instanceNameвам слід запустити select @@ServiceNameзапит.


По-перше, у вас коса риса неправильно. Правильна форма - "server \ instance". По-друге, не завжди вірно, що @@ 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, і клієнт повинен відкрити інше підключення до того самого екземпляра, що використовується поточним підключенням.


ВИБЕРІТЬ КОНВЕРТ (ім'я користувача, SERVERPROPERTY ('ім'я сервера')); є правильною відповіддю
Штефан Штайгер

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.