Come ottenere il nome dell'istanza corrente da T-SQL


91

Come posso ottenere il server SQL Server e il nome dell'istanza della connessione corrente, utilizzando uno script T-SQL?


La risposta accettata è corretta. SELECT @@SERVERNAMEproduce il risultato necessario per connettersi utilizzando sqlcmd -S. Se è l'istanza MSSQLSERVER predefinita, non deve essere specificata nel parametro -S. Questo è su 2017 14.0.2002.14 Developer edition, 64 bit.
acceso il

Risposte:


166

Ho appena trovato la risposta, in questa domanda SO (letteralmente, all'interno della domanda, nessuna risposta):

SELECT @@servername

restituisce servername \ istanza fino a quando questa non è l'istanza predefinita

SELECT @@servicename

restituisce il nome dell'istanza, anche se questo è il valore predefinito (MSSQLSERVER)


1
@blasto, questo sembra essere il comportamento quando l'istanza è l'impostazione predefinita sul server. Prova con un'istanza denominata. Controlla questo: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez

10
Errato, usare @@ servername può darti una risposta sbagliata. SELEZIONA CONVERT (sysname, SERVERPROPERTY ('servername')) è la risposta corretta. @@ ServerName segnala il nome del cluster SQL, mentre serverproperty ("servername") segnala il nome del cluster di Windows. Hai bisogno del nome del cluster di Windows per connetterti al tuo db (il nome del cluster di Windows può essere diverso dal nome del cluster SQL; questo di solito accade quando installi una nuova versione del server sql su una macchina diversa (@@ servername = Environment.MachineName) e vuoi mantenere il vecchio nome in modo da non dover cambiare tutte le configurazioni).
Stefan Steiger

1
@StefanSteiger La risposta accettata alla domanda SO collegata indica la soluzione che hai presentato, ma i commenti indicano che non funziona per alcune persone.
Trisped

17

Cosa ne pensi di questo:

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

Questo riceverà anche il nome dell'istanza. nullsignifica istanza predefinita:

SELECT SERVERPROPERTY ('InstanceName')

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


10
SELECT SERVERPROPERTY ('InstanceName') mi dà un NULL.
Steam

4
invece usa SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger

1
@Steam: Probabilmente perché è l'istanza predefinita.
Stefan Steiger

10

SELECT @@servername ti darà i dati come server/instanceName

Per ottenere solo il instanceNameè necessario eseguire select @@ServiceNamequery.


In primo luogo, hai il taglio nel modo sbagliato. La forma corretta è "server \ istanza". Secondo, non è sempre vero che @@ servername ti darà sia il server che l'istanza perché quando c'è solo una singola istanza restituirà solo "server".
Robino

9

Perché fermarsi solo al nome dell'istanza? Puoi inventario del tuo ambiente SQL Server con quanto segue:

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
Roba buona Nate, ho uno script Inventory simile e più avanzato che fa lo stesso. contattatemi per una copia via e-mail ... Lo script sarebbe fuori fuoco per questo thread.
Hank Freeman

8

Ho trovato questo:

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

Questo ti darà un elenco di tutte le istanze installate nel tuo server.


La ServerNameproprietà della SERVERPROPERTYfunzione e @@SERVERNAMErestituisce informazioni simili. La ServerNameproprietà fornisce il server Windows e il nome dell'istanza che insieme costituiscono l'istanza del server univoca. @@SERVERNAMEfornisce il nome del server locale attualmente configurato.

E l'esempio di Microsoft per il server corrente è:

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

Questo scenario è utile quando sono presenti più istanze di SQL Server installate su un server Windows e il client deve aprire un'altra connessione alla stessa istanza utilizzata dalla connessione corrente.


SELEZIONA CONVERT (sysname, SERVERPROPERTY ('servername')); è la risposta corretta
Stefan Steiger

2

Per ottenere l'elenco dei server e delle istanze a cui sei connesso:

select * from Sys.Servers

Per ottenere l'elenco dei database di cui dispone il server connesso:

SELECT * from sys.databases;

1

Giusto per aggiungere qualche chiarimento alle query del registro. Elenca solo le istanze del bitness corrispondente (32 o 64) per l'istanza corrente.

La chiave di registro effettiva per istanze SQL a 32 bit su un sistema operativo a 64 bit è:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Puoi eseguire una query su un'istanza a 64 bit per ottenere anche tutte le istanze a 32 bit. L'istanza a 32 bit sembra limitata al Wow6432Node, quindi non è in grado di leggere l'albero del registro a 64 bit.


0

un altro metodo per trovare il nome dell'istanza: fare clic con il pulsante destro del mouse sul nome del database e selezionare Proprietà, in questa parte è possibile visualizzare le proprietà della connessione nell'angolo in basso a sinistra, fare clic per visualizzare il nome dell'istanza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.