Comment obtenir le nom d'instance actuel à partir de T-SQL

90

Comment puis-je obtenir le serveur SQL Server et le nom de l'instance de la connexion actuelle à l'aide d'un script T-SQL?

Guillermo Gutiérrez
la source
La réponse acceptée est correcte. SELECT @@SERVERNAMEproduit le résultat nécessaire pour se connecter en utilisant sqlcmd -S. S'il s'agit de l'instance MSSQLSERVER par défaut, elle ne doit pas être spécifiée dans le paramètre -S. Ceci est sur 2017 14.0.2002.14 Developer Edition, 64 bits.
éclairé le

Réponses:

165

Je viens de trouver la réponse, dans cette question SO (littéralement, à l'intérieur de la question, pas de réponse):

SELECT @@servername

renvoie nom_serveur \ instance dans la mesure où ce n'est pas l'instance par défaut

SELECT @@servicename

renvoie le nom de l'instance, même s'il s'agit de la valeur par défaut (MSSQLSERVER)

Guillermo Gutiérrez
la source
1
@blasto, cela semble être le comportement lorsque l'instance est la valeur par défaut sur le serveur. Essayez avec une instance nommée. Vérifiez ceci: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Incorrect, utiliser @@ nom_serveur peut vous donner une mauvaise réponse. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) est la bonne réponse. Le @@ ServerName indique le nom du cluster SQL, tandis que serverproperty ('servername') indique le nom du cluster Windows. Vous avez besoin du nom du cluster Windows pour vous connecter à votre base de données (le nom du cluster Windows peut être différent du nom du cluster SQL; cela se produit généralement lorsque vous installez une nouvelle version de sql-server sur une machine différente (@@ servername = Environment.MachineName) et que vous souhaitez conserver l'ancien nom pour ne pas avoir à changer toutes les configurations).
Stefan Steiger
1
@StefanSteiger La réponse acceptée de la question SO liée indique la solution que vous avez présentée, mais les commentaires indiquent que cela ne fonctionne pas pour certaines personnes.
Trisped le
17

Que dis-tu de ça:

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

Cela obtiendra également le nom de l'instance. nullsignifie instance par défaut:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
la source
10
SELECT SERVERPROPERTY ('InstanceName') me donne un NULL.
Steam
4
à la place, utilisez SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger
1
@Steam: Probablement parce que c'est l'instance par défaut.
Stefan Steiger
10

SELECT @@servername vous donnera des données comme server/instanceName

Pour obtenir uniquement le, instanceNamevous devez exécuter la select @@ServiceNamerequête.

Shirishkumar Bari
la source
Tout d'abord, vous avez la barre oblique dans le mauvais sens. La forme correcte est "serveur \ instance". Deuxièmement, il n'est pas toujours vrai que @@ nom_serveur vous donnera à la fois le serveur ET l'instance car lorsqu'il n'y a qu'une seule instance, il ne retournera que "serveur".
Robino
8

J'ai trouvé ça:

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

Cela vous donnera la liste de toutes les instances installées sur votre serveur.


La ServerNamepropriété de la SERVERPROPERTYfonction et @@SERVERNAMErenvoie des informations similaires. La ServerNamepropriété fournit le serveur Windows et le nom de l'instance qui, ensemble, constituent l'instance de serveur unique. @@SERVERNAMEfournit le nom du serveur local actuellement configuré.

Et l'exemple de Microsoft pour le serveur actuel est:

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

Ce scénario est utile lorsque plusieurs instances de SQL Server sont installées sur un serveur Windows et que le client doit ouvrir une autre connexion à la même instance utilisée par la connexion actuelle.

shA.t
la source
SELECT CONVERT (sysname, SERVERPROPERTY ('servername')); est la bonne réponse
Stefan Steiger
8

Pourquoi s'arrêter au seul nom de l'instance? Vous pouvez inventorier votre environnement SQL Server avec les éléments suivants:

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.
la source
1
Good Stuff Nate, j'ai un script d'inventaire similaire plus amélioré faisant de même. contactez-moi pour une copie par e-mail ... Le script serait flou pour ce fil.
Hank Freeman
2

Pour obtenir la liste des serveurs et des instances auxquels vous êtes connecté:

select * from Sys.Servers

Pour obtenir la liste des bases de données dont dispose le serveur connecté:

SELECT * from sys.databases;
Saravanan Andavar
la source
1

Juste pour ajouter quelques éclaircissements aux requêtes du registre. Ils répertorient uniquement les instances du bitness correspondant (32 ou 64) pour l'instance actuelle.

La clé de registre réelle pour les instances SQL 32 bits sur un système d'exploitation 64 bits est:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Vous pouvez l'interroger sur une instance 64 bits pour obtenir également toutes les instances 32 bits. L'instance 32 bits semble limitée au Wow6432Node et ne peut donc pas lire l'arborescence du registre 64 bits.

Colin Campbell
la source
0

une autre méthode pour trouver le nom de l'instance - Cliquez avec le bouton droit sur le nom de la base de données et sélectionnez Propriétés, dans cette partie, vous pouvez voir les propriétés de connexion dans le coin gauche en bas, cliquez dessus, puis vous pouvez voir le nom de l'instance.

Yasin
la source