Jak uzyskać nazwę bieżącej instancji z T-SQL

90

Jak uzyskać serwer SQL Server i nazwę wystąpienia bieżącego połączenia za pomocą skryptu T-SQL?

Guillermo Gutiérrez
źródło
Przyjęta odpowiedź jest prawidłowa. SELECT @@SERVERNAMEdaje wynik potrzebny do połączenia za pomocą sqlcmd -S. Jeśli jest to domyślna instancja MSSQLSERVER, to nie można jej określić w parametrze -S. To jest wersja 64-bitowa dla programistów z 2017 r. 14.0.2002.14.
zapalił

Odpowiedzi:

166

Właśnie znalazłem odpowiedź, w tym pytaniu SO (dosłownie, wewnątrz pytania, nie ma żadnej odpowiedzi):

SELECT @@servername

zwraca nazwa_serwera \ instancja, o ile nie jest to instancja domyślna

SELECT @@servicename

zwraca nazwę instancji, nawet jeśli jest to wartość domyślna (MSSQLSERVER)

Guillermo Gutiérrez
źródło
1
@blasto, wydaje się, że zachowuje się tak, gdy instancja jest domyślna na serwerze. Spróbuj z nazwaną instancją. Sprawdź to: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Niepoprawnie, użyj @@ nazwa_serwera może dać złą odpowiedź. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) to poprawna odpowiedź. @@ nazwa_serwera zgłasza nazwę klastra SQL, a właściwość serwera („nazwa_serwera”) podaje nazwę klastra systemu Windows. Aby połączyć się ze swoją bazą danych, potrzebujesz nazwy klastra Windows (nazwa klastra Windows może się różnić od nazwy klastra SQL; zwykle dzieje się tak podczas instalowania nowej wersji serwera sql na innym komputerze (@@ nazwa_serwera = Environment.MachineName) i chcesz zachować starą nazwę, więc nie musisz zmieniać wszystkich konfiguracji).
Stefan Steiger
1
@StefanSteiger Zaakceptowana odpowiedź na powiązane pytanie SO wskazuje rozwiązanie, które przedstawiłeś, ale komentarze wskazują, że nie działa ono dla niektórych osób.
Trisped
17

Co powiesz na to:

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

Spowoduje to również uzyskanie nazwy instancji. nulloznacza instancję domyślną:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
źródło
10
SELECT SERVERPROPERTY („InstanceName”) daje mi wartość NULL.
Steam
4
zamiast tego użyj SELECT CONVERT (nazwa_serwera, SERVERPROPERTY ('nazwa_serwera'));
Stefan Steiger
1
@Steam: Prawdopodobnie dlatego, że jest to instancja domyślna.
Stefan Steiger
10

SELECT @@servername poda Ci dane jako server/instanceName

Aby uzyskać tylko to instanceName, należy uruchomić select @@ServiceNamezapytanie.

Shirishkumar Bari
źródło
Po pierwsze, masz niewłaściwy sposób cięcia. Prawidłowa forma to „serwer \ instancja”. Po drugie, nie zawsze jest prawdą, że @@ nazwa_serwera podaje zarówno serwer, jak i instancję, ponieważ gdy jest tylko jedna instancja, zwróci ona tylko „serwer”.
Robino
8

Znalazłem to:

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

To da ci listę wszystkich instancji zainstalowanych na twoim serwerze.


ServerNameWłasność SERVERPROPERTYfunkcji i @@SERVERNAMEpowrócić podobne informacje. ServerNameObiekt zapewnia serwera i nazwa instancji systemu Windows, które razem tworzą niepowtarzalną instancję serwera. @@SERVERNAMEzawiera aktualnie skonfigurowaną nazwę serwera lokalnego.

Przykładem firmy Microsoft dla obecnego serwera jest:

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

Ten scenariusz jest przydatny, gdy istnieje wiele wystąpień programu SQL Server zainstalowanych na serwerze Windows, a klient musi otworzyć inne połączenie z tym samym wystąpieniem używanym przez bieżące połączenie.

shA.t
źródło
SELECT CONVERT (nazwa_serwera, SERVERPROPERTY ('nazwa_serwera')); to prawidłowa odpowiedź
Stefan Steiger
8

Dlaczego poprzestać tylko na nazwie instancji? Możesz inwentaryzować swoje środowisko SQL Server za pomocą:

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 S.
źródło
1
Good Stuff Nate, mam podobny, ulepszony skrypt Inventory, który robi to samo. skontaktuj się ze mną, aby otrzymać kopię e-mailem ... W tym wątku skrypt byłby nieostry.
Hank Freeman
2

Aby uzyskać listę serwerów i instancji, z którymi masz połączenie:

select * from Sys.Servers

Aby uzyskać listę baz danych, które posiada podłączony serwer:

SELECT * from sys.databases;
Saravanan Andavar
źródło
1

Tylko po to, aby dodać wyjaśnienia do zapytań rejestru. Podają tylko wystąpienia pasującej bitowości (32 lub 64) dla bieżącej instancji.

Rzeczywisty klucz rejestru dla 32-bitowych instancji SQL w 64-bitowym systemie operacyjnym to:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Możesz wysłać zapytanie do instancji 64-bitowej, aby uzyskać również wszystkie instancje 32-bitowe. Wystąpienie 32-bitowe wydaje się ograniczone do Wow6432Node, więc nie może odczytać 64-bitowego drzewa rejestru.

Colin Campbell
źródło
0

inna metoda znajdowania nazwy instancji - kliknij prawym przyciskiem myszy nazwę bazy danych i wybierz opcję Właściwości, w tej części możesz zobaczyć właściwości połączenia w lewym dolnym rogu, kliknij, aby wyświetlić nazwę instancji.

Yasin
źródło