Olá pessoal,
Boa tarde!

Neste post vou demonstrar como podemos acessar o registro do Windows e obter informações úteis sobre a instância SQL Server.

Caso você queira saber como consultar qualquer chave de registro do Windows, bem como realizar alterações em chaves e valores, acesse o post SQL Server – Como ler, listar, criar, alterar e apagar chaves do Registro do Windows (Regedit) pelo CLR (C#)

Utilizando a DMV sys.dm_server_registry

Disponibilizada a partir do SQL Server 2008 R2, a DMV sys.dm_server_registry permite acessar facilmente as informações do registro referentes a instância SQL Server em que está sendo realizada a consulta.

A query é bem simples:

SELECT * FROM sys.dm_server_registry

E o resultado da consulta será algo parecido com isso:

SQL Server - sys.dm_server_registry
SQL Server - sys.dm_server_registry

Agora vamos comparar com o próprio Registro do Windows (RegEdit):

SQL Server - Instance Regedit
SQL Server - Instance Regedit

Reparem que a DMV retorna várias chaves diferentes do registro do Windows e as agrupa em uma visão única, de modo que facilite a vida do DBA e não precise consultar várias chaves para obter a informação que precisa.

Se compararmos os registros que estão debaixo da chave “HKLM\Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer\Parameters”, veremos que são os mesmos valores.

Isso é bastante útil para se descobrir algumas informações da instância, como a porta utilizada, por exemplo (já comentei sobre isso no post Como identificar a porta utilizada pela instância do SQL Server)

Utilizando a extended procedure xp_instance_regread

Disponível a partir do SQL Server 2000, essa procedure extendida não possui muita documentação na Internet ou pela própria Microsoft (assim como a maioria das XP’s), mas é bem útil para recuperar e consultar informações da instância no Windows Registry, principalmente por estar disponível em todas as versões do SQL Server até o momento.

O seu uso é bem simples, e diferente da DMV, só retorna uma registro. Sendo assim, não é possível listar as chaves e valores de uma só vez, devem ser consultados manualmente. Por este motivo, a DMV e essa procedure possuem conceitos e finalidades diferentes.

Exemplo de utilização para retornar a versão da instância:

DECLARE @dir NVARCHAR(4000)

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion\',
    N'CurrentVersion',
    @dir OUTPUT

SELECT @dir

Obs: Vale lembrar que assim como as outras Extended Procedures, não é permitido uma variável de OUTPUT com mais de 4.000 caracteres como parâmetro para receber os dados retornados.

Caso seja informado um NVARCHAR(4001) ou NVARCHAR(MAX), por exemplo, a variável de OUTPUT gerará uma mensagem de erro ou ficará sem valor (NULL), no caso do NVARCHAR(MAX).

Utilizando a extended procedure xp_regread

Assim como a XP xp_instance_regread, essa procedure está disponível desde a versão 2000 do SQL Server até as versões atuais e permite consultar qualquer chave de registro do servidor onde a instância está instalada.

Quem acompanha o meu blog há algum tempo já deve conhecer a XP xp_regread através do post As procedures estendidas não documentadas do SQL Server. Se você ainda não acessou esse post, não perca tempo! Vale a pena.

A grande diferença entre essa XP e a xp_instance_regread, é que a xp_instance_regread “converte” o caminho informado, transformando “Microsoft\MSSQLServer” em “Microsoft\Microsoft SQL Server\<Sua instancia>\MSSQLServer”.

Ex: Se você informar “Software\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion\”, a SP irá converter para “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer” (no meu caso), que é o local de instalação padrão da instância que estou conectado.

Isso é especialmente importante quando o servidor possui mais de uma instância instalada. Com exatamente o mesmo código, você pode consultar as chaves da sua instância sem se preocupar em alterar a chave de registro do seu código para cada instância.

Exemplo de utilização da xp_regread:

DECLARE @dir NVARCHAR(4000)

EXEC master.dbo.xp_regread
    N'HKEY_LOCAL_MACHINE',
    N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\MSSQLServer\CurrentVersion',
    N'CurrentVersion',
    @dir OUTPUT

SELECT @dir

Como vocês podem observar, utilizando essa SP precisamos informar o caminho completo da chave do registro. Porém, ela nos permite realizar consultas em qualquer chave do registro do Windows, como o exemplo abaixo:

SQL Server - Windows Registry xp_regread
SQL Server - Windows Registry xp_regread

É isso aí, galera!
Obrigado pela visita e até o próximo post!