¡Hola, chicos!
En el post de hoy les voy a dar un consejo muy rápido, que es cómo identificar los parámetros de inicialización de la instancia usando T-SQL, un escenario muy útil cuando tienes acceso para conectarte a la instancia, pero no tienes acceso al sistema operativo del servidor.

Usando el Administrador de configuración de SQL Server

Para aquellos que no lo saben, el servicio SQL Server tiene algunas parámetros de arranque, que le permiten cambiar el comportamiento de SQL Server. Algunos de ellos ya están definidos de forma predeterminada, como -d (ruta de datos maestros), -l (ruta de registro maestro) y -e (ruta de registro de errores predeterminada).

Cuando tienes acceso al sistema operativo del servidor, normalmente abres el Administrador de configuración de SQL Server, seleccionas la instancia donde deseas ver los parámetros y seleccionas la opción “Propiedades” haciendo clic con el botón derecho del mouse, como se muestra en la imagen a continuación:

Usando sys.dm_server_registry en SQL Server 2008 R2 SP1

Pero ¿qué pasa cuando este acceso no es posible? En este caso una alternativa muy práctica es acceder al registro de Windows a través de SQL Server. SQL Server almacena esta información de inicio en la clave de registro “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.SQL2017\MSSQLServer\Parameters”, donde MSSQL14.SQL2017 = MSSQL., es decir, este valor variará según su instancia y versión de SQL Server.

Para facilitar la recuperación de esta información, podemos utilizar DMV dm_server_registry, disponible desde SQL Server 2008 R2 SP1, filtrando por clave_registro:

SELECT * 
FROM sys.dm_server_registry
WHERE registry_key LIKE '%Parameters'

Resultado:

Usando el acceso al registro de XP xp_instance_regread

Sin embargo, aquellos que trabajan con múltiples clientes y múltiples versiones de SQL Server tal vez quieran estandarizar un único script para versiones anteriores a SQL Server 2008 R2 SP1, donde el DMV sys.dm_server_registry aún no estaba disponible.

Si se encuentra en este escenario o incluso su SQL Server es anterior a 2008 R2 SP1, puede usar los procedimientos extendidos (XP) para el acceso al registro (xp_instance_regread y xp_regread) para devolver el valor de un parámetro individual o crear un bucle para hacer esto:

DECLARE 
    @Contador INT = 0,
    @Total INT = 10,
    @Chave VARCHAR(10)

DECLARE @SQLArgs TABLE
(
    [Value] VARCHAR(50),
    [Data] VARCHAR(500),
    ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', ''))
)


WHILE(@Contador <= @Total)
BEGIN

    SET @Chave = 'SQLArg' + CAST(@Contador AS VARCHAR(2))

    INSERT INTO @SQLArgs
    EXEC sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\MSSQLServer\Parameters', @Chave
        
    SET @Contador += 1

END


SELECT * FROM @SQLArgs

Resultado:

Usando el acceso al registro de XP xp_regread

También puedes usar xp_regread, pero tendrás que ingresar el nombre lógico de la instancia (en el caso del ejemplo, MSSQL10_50.SQL2008), mientras que xp_instance_regread ya devuelve el nombre lógico de la instancia a la que está conectada tu sesión:

DECLARE 
    @Contador INT = 0,
    @Total INT = 10,
    @Chave VARCHAR(10)

DECLARE @SQLArgs TABLE
(
    [Value] VARCHAR(50),
    [Data] VARCHAR(500),
    ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', ''))
)


WHILE(@Contador <= @Total)
BEGIN

    SET @Chave = 'SQLArg' + CAST(@Contador AS VARCHAR(2))

    INSERT INTO @SQLArgs
    EXEC sys.xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQLServer\Parameters', @Chave
        
    SET @Contador += 1

END

SELECT * FROM @SQLArgs

Resultado:

Usando XP para acceder al registro xp_instance_regenumvalues ​​​​

Analizando el código de las 2 soluciones que usan XP's anteriores, podemos notar que tienen un gran problema: Usar WHILE sin un tamaño correcto definido. Si tiene menos de 11 parámetros, WHILE se ejecutará más veces de las necesarias. Si hay más, dejará de enumerar algunos parámetros. Para solucionar esto, podemos utilizar el Procedimiento Extendido indocumentado, xp_instance_regenumvalues, para ayudarnos con esta necesidad:

DECLARE
    @ChaveMestre VARCHAR(50) = 'HKEY_LOCAL_MACHINE',
    @Registro VARCHAR(100) = 'Software\Microsoft\MSSQLSERVER\MSSQLServer\Parameters'

DECLARE @SQLArgs TABLE
(
    [Value] VARCHAR(50),
    [Data] VARCHAR(500),
    ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', ''))
)

INSERT INTO @SQLArgs
EXECUTE master.sys.xp_instance_regenumvalues @ChaveMestre, @Registro

SELECT * FROM @SQLArgs

Resultado:

Bueno chicos, espero que les haya gustado este consejo. Para aquellos que no conocían DMV sys.dm_server_registry o estos procedimientos extendidos que demostré en este artículo, ahora los conocen.
Un fuerte abrazo y nos vemos en el próximo post.