Como obter o nome da instância atual do T-SQL

91

Como posso obter o servidor SQL Server e o nome da instância da conexão atual, usando um script T-SQL?

Guillermo Gutiérrez
fonte
A resposta aceita está correta. SELECT @@SERVERNAMEproduz o resultado necessário para conectar usando sqlcmd -S. Se for a instância padrão do MSSQLSERVER, então ela não deve ser especificada no parâmetro -S. Isso é em 2017, 14.0.2002.14 Developer edition, 64 bits.
iluminado em

Respostas:

166

Acabei de encontrar a resposta, nesta pergunta SO (literalmente, dentro da pergunta, nenhuma resposta):

SELECT @@servername

retorna nomedoservidor \ instância, desde que esta não seja a instância padrão

SELECT @@servicename

retorna o nome da instância, mesmo se este for o padrão (MSSQLSERVER)

Guillermo Gutiérrez
fonte
1
@blasto, esse parece ser o comportamento quando a instância é a padrão no servidor. Tente com uma instância nomeada. Verifique isto: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Incorreto, use @@ servername pode dar a você uma resposta errada. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) é a resposta correta. O @@ ServerName relata o nome do cluster SQL, enquanto serverproperty ('servername') relata o nome do cluster do Windows. Você precisa do nome do cluster do Windows para se conectar ao seu banco de dados (o nome do cluster do Windows pode ser diferente do nome do cluster SQL; isso geralmente acontece quando você instala uma nova versão do sql-server em uma máquina diferente (@@ servername = Environment.MachineName) e deseja manter o nome antigo para que você não precise alterar todas as configurações).
Stefan Steiger
1
@StefanSteiger A resposta aceita da pergunta do SO vinculada indica a solução que você apresentou, mas os comentários indicam que ela não funciona para algumas pessoas.
Trisped em
17

Que tal agora:

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

Isso também obterá o nome da instância. nullsignifica instância padrão:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
fonte
10
SELECT SERVERPROPERTY ('InstanceName') me dá um NULL.
Steam
4
em vez disso, use SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger
1
@Steam: Provavelmente porque é a instância padrão.
Stefan Steiger
10

SELECT @@servername lhe dará dados como server/instanceName

Para obter apenas o, instanceNamevocê deve executar a select @@ServiceNameconsulta.

Shirishkumar Bari
fonte
Primeiro, você tem a barra do lado errado. A forma correta é "servidor \ instância". Em segundo lugar, nem sempre é verdade que @@ nome_do_servidor fornecerá a você o servidor E a instância, porque quando houver apenas uma instância, ele retornará apenas "servidor".
Robino
9

Por que parar apenas no nome da instância? Você pode inventariar seu ambiente SQL Server com o seguinte:

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.
fonte
1
Boas coisas Nate, eu tenho um script de inventário mais aprimorado semelhante fazendo o mesmo. contate-me para uma cópia por e-mail ... O roteiro estaria fora de foco para este tópico.
Hank Freeman
8

Eu achei isto:

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

Isso lhe dará uma lista de todas as instâncias instaladas em seu servidor.


A ServerNamepropriedade da SERVERPROPERTYfunção e @@SERVERNAMEretorna informações semelhantes. A ServerNamepropriedade fornece o servidor Windows e o nome da instância que, juntos, constituem a instância exclusiva do servidor. @@SERVERNAMEfornece o nome do servidor local atualmente configurado.

E o exemplo da Microsoft para o servidor atual é:

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

Este cenário é útil quando há várias instâncias do SQL Server instaladas em um servidor Windows e o cliente deve abrir outra conexão com a mesma instância usada pela conexão atual.

shA.t
fonte
SELECT CONVERT (sysname, SERVERPROPERTY ('servername')); é a resposta correta
Stefan Steiger
2

Para obter a lista de servidores e instâncias aos quais você está conectado:

select * from Sys.Servers

Para obter a lista de bancos de dados que o servidor conectado possui:

SELECT * from sys.databases;
Saravanan Andavar
fonte
1

Só para esclarecer as dúvidas do registro. Eles listam apenas as instâncias do número de bits correspondente (32 ou 64) para a instância atual.

A chave de registro real para instâncias SQL de 32 bits em um sistema operacional de 64 bits é:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Você pode consultar isso em uma instância de 64 bits para obter todas as instâncias de 32 bits também. A instância de 32 bits parece restrita ao Wow6432Node, portanto, não pode ler a árvore de registro de 64 bits.

Colin Campbell
fonte
0

outro método para encontrar o nome da instância - clique com o botão direito no nome do banco de dados e selecione Propriedades, nesta parte você pode ver as propriedades da conexão no canto esquerdo inferior, clique nisso e então você pode ver o nome da instância.

Yasin
fonte