Cómo obtener el nombre de la instancia actual de T-SQL

90

¿Cómo puedo obtener el servidor SQL Server y el nombre de la instancia de la conexión actual, usando un script T-SQL?

Guillermo Gutiérrez
fuente
La respuesta aceptada es correcta. SELECT @@SERVERNAMEproduce el resultado necesario para conectarse usando sqlcmd -S. Si es la instancia predeterminada de MSSQLSERVER, entonces no debe especificarse en el parámetro -S. Esto es en 2017 14.0.2002.14 Developer Edition, 64 bits.
encendido el

Respuestas:

166

Acabo de encontrar la respuesta, en esta pregunta SO (literalmente, dentro de la pregunta, no cualquier respuesta):

SELECT @@servername

devuelve servername \ instance en la medida en que esta no sea la instancia predeterminada

SELECT @@servicename

devuelve el nombre de la instancia, incluso si este es el predeterminado (MSSQLSERVER)

Guillermo Gutiérrez
fuente
1
@blasto, ese parece ser el comportamiento cuando la instancia es la predeterminada en el servidor. Pruebe con una instancia con nombre. Verifique esto: technet.microsoft.com/en-us/library/ms187944.aspx
Guillermo Gutiérrez
10
Incorrecto, usar @@ servername puede darle una respuesta incorrecta. SELECT CONVERT (sysname, SERVERPROPERTY ('servername')) es la respuesta correcta. @@ ServerName informa el nombre del clúster SQL, mientras que serverproperty ('nombre del servidor') informa el nombre del clúster de Windows. Necesita el nombre del clúster de Windows para conectarse a su base de datos (el nombre del clúster de Windows puede ser diferente del nombre del clúster de SQL; esto suele ocurrir cuando instala una nueva versión de sql-server en una máquina diferente (@@ servername = Environment.MachineName) y desea mantener el nombre anterior para no tener que cambiar todas las configuraciones).
Stefan Steiger
1
@StefanSteiger La respuesta aceptada de la pregunta SO vinculada indica la solución que presentó, pero los comentarios indican que no funciona para algunas personas.
Trisped
17

Qué tal esto:

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

Esto también obtendrá el nombre de la instancia. nullsignifica instancia predeterminada:

SELECT SERVERPROPERTY ('InstanceName')

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

Beno
fuente
10
SELECT SERVERPROPERTY ('InstanceName') me da un NULL.
Steam
4
en su lugar use SELECT CONVERT (sysname, SERVERPROPERTY ('servername'));
Stefan Steiger
1
@Steam: Probablemente porque es la instancia predeterminada.
Stefan Steiger
10

SELECT @@servername te dará datos como server/instanceName

Para obtener solo el instanceName, debe ejecutar select @@ServiceNamequery.

Shirishkumar Bari
fuente
Primero, tienes la barra de la forma incorrecta. La forma correcta es "servidor \ instancia". En segundo lugar, no siempre es cierto que @@ servername le dará tanto el servidor como la instancia porque cuando solo hay una instancia, devolverá solo "servidor".
Robino
8

Encontré esto:

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

Eso le dará una lista de todas las instancias instaladas en su servidor.


La ServerNamepropiedad de la SERVERPROPERTYfunción y @@SERVERNAMEdevuelve información similar. La ServerNamepropiedad proporciona el servidor de Windows y el nombre de la instancia que juntos forman la instancia de servidor única. @@SERVERNAMEproporciona el nombre del servidor local configurado actualmente.

Y el ejemplo de Microsoft para el servidor actual es:

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

Este escenario es útil cuando hay varias instancias de SQL Server instaladas en un servidor de Windows y el cliente debe abrir otra conexión a la misma instancia utilizada por la conexión actual.

shA.t
fuente
SELECT CONVERT (sysname, SERVERPROPERTY ('nombre del servidor')); es la respuesta correcta
Stefan Steiger
8

¿Por qué detenerse solo en el nombre de la instancia? Puede hacer un inventario de su entorno de SQL Server con lo siguiente:

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.
fuente
1
Buenas cosas Nate, tengo un script de inventario mejorado similar que hace lo mismo. contácteme para una copia por correo electrónico ... El script estaría fuera de foco para este hilo.
Hank Freeman
2

Para obtener la lista del servidor y la instancia a la que está conectado:

select * from Sys.Servers

Para obtener la lista de bases de datos que tiene el servidor conectado:

SELECT * from sys.databases;
Saravanan Andavar
fuente
1

Solo para agregar algunas aclaraciones a las consultas del registro. Solo enumeran las instancias del bitness coincidente (32 o 64) para la instancia actual.

La clave de registro real para instancias SQL de 32 bits en un sistema operativo de 64 bits es:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Puede consultar esto en una instancia de 64 bits para obtener también todas las instancias de 32 bits. La instancia de 32 bits parece restringida al Wow6432Node, por lo que no se puede leer el árbol de registro de 64 bits.

Colin Campbell
fuente
0

Otro método para encontrar el nombre de la instancia: haga clic con el botón derecho en el nombre de la base de datos y seleccione Propiedades, en esta parte puede ver las propiedades de conexión de la vista en la esquina inferior izquierda, haga clic en eso y luego podrá ver el nombre de la instancia.

Yasin
fuente