Fala pessoal!
Nesse post de hoje vou dar uma dica bem rápida, que é como identificar os parâmetros de inicialização da instância utilizando T-SQL, cenário bem útil quando você tem acesso à conecta na instância, mas não tem acesso ao sistema operacional do servidor.

Utilizando o SQL Server Configurando Manager

Para quem não sabe, o serviço do SQL Server possui alguns parâmetros de inicialização, que permitem alterar o comportamento do SQL Server. Alguns deles já são definidos por padrão, como o -d (caminho dos dados da master), -l (caminho do log da master) e -e (caminho padrão do errorlog).

Quando você tem acesso ao sistema operacional do servidor, você normalmente abre o SQL Server Configuration Manager, seleciona a instância que deseja visualizar os parâmetros e seleciona a opção “Propriedades” ao clicar com o botão direito do mouse, conforme a imagem abaixo:

Utilizando a sys.dm_server_registry do SQL Server 2008 R2 SP1

Mas e quando esse acesso não é possível? Nesse caso, uma alternativa bem prática é acessando o registro do Windows pelo SQL Server. O SQL Server armazena essas informações de inicialização na chave de registro “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.SQL2017\MSSQLServer\Parameters”, onde MSSQL14.SQL2017 = MSSQL., ou seja, esse valor vai variar conforme a sua instância e versão do SQL Server.

Para facilitar a recuperação dessas informações, podemos utilizar DMV dm_server_registry, disponível a partir do SQL Server 2008 R2 SP1, filtrando pela registry_key:

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

Resultado:

Utilizando XP de acesso ao registro xp_instance_regread

Entretanto, quem trabalha com vários clientes e várias versões do SQL Server, pode ter a vontade de padronizar um script único para as versões anteriores ao SQL Server 2008 R2 SP1, onde a DMV sys.dm_server_registry ainda não estava disponível.

Se você está nesse cenário ou mesmo o seu SQL Server é anterior ao 2008 R2 SP1, você pode utilizar as Extended Procedures (XP’s) de acesso ao registro (xp_instance_regread e xp_regread) para retornar o valor de um parâmetro individual ou criar um loop para fazer isso:

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:

Utilizando XP de acesso ao registro xp_regread

Você também pode utilizar a xp_regread, mas você terá que informar o nome lógico da instância (no caso do exemplo, MSSQL10_50.SQL2008), enquanto a xp_instance_regread já retorna o nome lógico da instância em que a sua sessão está conectada:

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:

Utilizando XP de acesso ao registro xp_instance_regenumvalues

Analisando o código das 2 soluções utilizando XP’s acima, podemos notar que elas tem um grande problema: Uso de WHILE sem um tamanho correto definido. Se tiver menos de 11 parâmetros, o WHILE estará executando mais vezes que o necessário. Se tiver mais, ele vai deixar de listar alguns parâmetros. Para resolver isso, podemos utilizar a Extended Procedure não documentada, xp_instance_regenumvalues, para nos ajudar nessa necessidade:

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:

Bom pessoal, espero que tenham gostado dessa dica. Para quem não conhecia a DMV sys.dm_server_registry ou essas Extended Procedures que demonstrei nesse artigo, agora você já conhece.
Um grande abraço e até o próximo post.