terça-feira, 17 de novembro de 2009

Diminuir o tamanho do banco TempDB

As vezes algum processo pesado ou longo pode influenciar muito no tamanho do arquivo de dados (mdf) do TempDB. A solução para diminuir novamente o arquivo é simples.

Método 1:
Diminui para um tamanho especifico:
USE TEMPDB
GO
DBCC SHRINKFILE (tempdev, 50)
--* O comando acima diminui o tamanho do arquivo de dados do tempdb para 50MB.

DBCC SHRINKFILE (templog, 5)
--* O comando acima diminui o tamanho do arquivo de log do tempdb para 5MB.


Método 2:
Diminuir para um percentual do tamanho atual
DBCC SHRINKDATABASE (tempdb, 10)
--* O comando acima diminui o tamanho do banco tempdb para 10% do atual.


Os dois métodos acima podem não funcionar caso o banco de dados TempDB ainda possua dados, nesse caso o único método que funcionará é o 3o.

Método 3:

Esse método é o mais simples:

Reinicie o serviço do SQLServer:
Clique com o botão direito do mouse em "SQL Server" no SQL Server Configuration Manager e clique em Restart ou Reiniciar.






Para saber o resultado em qualquer dos métodos acima

SP_HELPDB TEMPDB

Como iniciar o SQLServer em modo single-user

Clique com o botão direito do mouse em "SQL Server" no SQL Server Configuration Manager e clique em Propriedades.
(Essas alterações podem tambem ser feitas pelo Services do Windows no serviço "SQL Server (MSSQLSERVER)")

Clique em Parâmetros de inicialização para visualizar as seguintes entradas:

A opção "-c" reduz o tempo de inicialização ao iniciar SQL Server no prompt de comando. Normalmente, o Mecanismo de Banco de Dados do SQL Server inicia como um serviço chamando o Gerenciador de Controle de Serviços. Porque o Mecanismo de Banco de Dados do SQL Server não inicia como um serviço quando inicia do prompt de comando.
A opção "-m" indica que quando você inicia uma instância de SQL Server em modo de usuário único, só um único usuário pode conectar.
A opção "-T3608" indica que uma instância de SQL Server deveria ser iniciada com um sinalizador de rastreamento especificado (trace#) em efeito. São usados sinalizadores de rastreamento para iniciar o servidor com comportamento sem padrão. O sinalizador de rastreamento 3608 evita que o SQL Server recupere qualquer banco de dados, exceto o banco de dados mestre.

O parametro de inicialização fica por exemplo:
-dD:\MSSQL\DATA\master.mdf;-eD:\MSSQL\LOG\ERRORLOG;-lC:\MSSQL\LOGS\mastlog.ldf; -m -c -T3608

Após alterado, pare o serviço e inicie novamente.

Para voltar ao modo normal, retire as opções -m -c -T3608 e reinicie o serviço.

Mover os arquivos do banco de dados Msdb

Para mover o banco de dados MSDB, é necessário iniciar o SQL Server com a opção -c, a opção -m e o sinalizador de rastreamento 3608.

O sinalizador de rastreamento 3608 evita que o SQL Server recupere na inicialização qualquer banco de dados, exceto o banco de dados Master.

Após adicionar a opção -c, a opção -m e o sinalizador de rastreamento 3608, execute as seguintes etapas:


. Interrompa e reinicie o SQL Server.
. Certifique-se de que o serviço SQL Server Agent não está sendo executado no momento.
. Desanexe o banco de dados msdb como segue:
use master
go
sp_detach_db 'msdb'
go

. Mova os arquivos Msdbdata.mdf e Msdblog.ldf do local atual (D:\Mssql8\Data) para o novo local (E:\Mssql8\Data).
. Remova -c -m -T3608 da caixa de parâmetros de inicialização no Enterprise Manager.
. Interrompa e reinicie o SQL Server.

Observação: Se tentar anexar novamente o banco de dados msdb iniciando o SQL Server junto com a opção -c, a opção -m e o sinalizador de rastreamento 3608, talvez você a seguinte mensagem de erro seja exibida:
Servidor: Msg 615, Nível 21, Estado 1, Linha 1
Não foi possível encontrar a tabela de banco de dados ID 3, nome 'Model'.

.Anexe novamente o banco de dados msdb conforme a seguir:
use master
go
sp_attach_db 'msdb','E:\Mssql8\Data\msdbdata.mdf','E:\Mssql8\Data\msdblog.ldf'
go

Observação: Se usar este procedimento e mover o banco de dados Model, estará tentando desanexar o banco de dados msdb enquanto desanexa o banco de dados Model.
Ao fazer isto, será necessário anexar novamente o banco de dados Model primeiro e anexar novamente o banco de dados msdb.
Se anexar novamente o banco de dados msdb primeiro, a seguinte mensagem de erro será exibida ao tentar anexar novamente o banco de dados Model:
Msg 0, Nível 11, Estado 0, Linha 0
Erro grave no comando atual. Os resultados, se houver, devem ser descartados.

Neste caso, é necessário desanexar o banco de dados msdb, anexar novamente o banco de dados Model e anexar novamente o banco de dados msdb.

Após mover o banco de dados msdb, talvez a seguinte mensagem de erro seja exibida:
Erro 229: Permissão EXECUTE negada no objeto'ObjectName', banco de dados 'mestre', proprietário 'dbo'.

Esse problema ocorre porque a corrente de propriedade foi quebrada.
Os proprietários do banco de dados msdb e do banco de dados mestre não são os mesmos.
Neste caso, o proprietário do banco de dados msdb foi alterado. Como solução alternativa, execute as seguintes declarações Transact-SQL.
É possível fazer isso usando a linha de comando Osql.exe ou a linha de comando Sqlcmd.exe:

USE MSDB
Go
EXEC sp_changedbowner 'sa'
Go

Mover os arquivos do banco de dados Master

Caso você preciso trocar o banco de dados Master de lugar, os passos são esses:

Observação: Aqui também é possível alterar o local do log de erro.

. Clique com o botão direito do mouse em "SQL Server" no SQL Server Configuration Manager e clique em Propriedades.
(Essas alterações podem tambem ser feitas pelo Services do Windows no serviço "SQL Server (MSSQLSERVER)")

. Clique em Parâmetros de inicialização para visualizar as seguintes entradas:
-dC:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\master.mdf -eC:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG -lC:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\mastlog.ldf

-d é o caminho totalmente qualificado para o arquivo de dados do banco de dados mestre.

-e é o caminho totalmente qualificado para o arquivo de log de erro.

-l é o caminho totalmente qualificado para o arquivo de log do banco de dados mestre.


. Altere os caminhos dos arquivos para o lugar desejado. No exemplo abaixo os arquivos serão passados para a Pasta D:\BD\SQLDATA e o Log para D:\BD\Log
-dD:\BD\SQLDATA\master.mdf -eD:\BD\Log -lD:\BD\SQLDATA\mastlog.ldf

. Pare o serviço "SQL Server".
. Copie os arquivos Master.mdf e Mastlog.ldf para o novo local (D:\BD\SQLDATA\).
. Inicie o serviço "SQL Server".

quarta-feira, 11 de novembro de 2009

Primeiras letras em maiúsculas sem Loop. (Camel Case)

Esse Select (CTE) usa a recursividade para trocar todas as primeiras letras das palavras para maiusculas:


Declare @Texto VarChar(8000)

Set @Texto = 'CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços. É um padrão largamente utilizado em diversas linguagens de programação, como Java, Ruby e Python, principalmente nas definições de Classes e Objetos. Pela sua associação com tecnologia, o marketing se apropriou dessa maneira de escrever, injetando certo ar de "tecnologia" nos produtos assim nomeados: iPod, GameCube, OpenOffice.org, StarCraft, dentre outros.'

;With tbCamelCase as (
Select upper( substring( @Texto, 1, 1 )) AS cc,
1 as Seq
Union All
select Case When substring(@Texto, n.Seq, 1) = ' '
Then upper(substring( @Texto, n.Seq + 1, 1 ))
Else substring( @Texto, n.Seq + 1, 1)
End AS cc,
n.Seq + 1 as Seq
From tbCamelCase n
Where n.Seq + 1 <= Len(@Texto))
Select Replace((Select cc AS [text()] from tbCamelCase for xml path( '' )), ' ', ' ')
option(maxrecursion 30000)

Números randomicos dentro de um período.

Seguindo a idéia dos últimos posts, essa rotina gera um número randomico dentro de um período estabelecido.

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT

SET @Lower = 800 --Limite inferior do periodo
SET @Upper = 999 --Limite superior do periodo
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND(CAST(NEWID() AS varbinary )) + @Lower), 0)
SELECT @Random


Um exemplo dessa aplicação é gerar números aleatórios de telefones:

DECLARE @Random VarChar(9)
DECLARE @Upper Decimal(9,0)
DECLARE @Lower Decimal(9,0)

SET @Lower = 30000000 --Limite inferior do periodo
SET @Upper = 99999999 --Limite superior do periodo
Select @Random = Stuff(Convert(VarChar(9), Convert(Decimal(9,0), ROUND(((99999999 - @Lower -1) * RAND(CAST(NEWID() AS varbinary)) + @Lower), 0))), 5, 0, '-')
SELECT @Random

Gerar CNPJ Válido

Por razões obvias de segurança de informação nós temos que trocar alguns dados (scramble) de informações confidenciais quando atualizamos as bases de desenvolvimento e homologação como dito nos post anterior. Outra informação necessãria é o CNPJ, essa rotina cria CNPJs validos e randomicos:



Declare @n Int, @n1 Int, @n2 Int, @n3 Int, @n4 Int, @n5 Int, @n6 Int, @n7 Int, @n8 Int, @n9 Int, @n10 Int, @n11 Int, @n12 Int
Declare @d1 Int, @d2 Int

Set @n = 9
Set @n1 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n2 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n3 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n4 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n5 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n6 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n7 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n8 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n9 = 0
Set @n10 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n11 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n12 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @d1 = @n12*2+@n11*3+@n10*4+@n9*5+@n8*6+@n7*7+@n6*8+@n5*9+@n4*2+@n3*3+@n2*4+@n1*5
Set @d1 = 11 - (@d1%11)
if (@d1>=10)
Set @d1 = 0
Set @d2 = @d1*2+@n12*3+@n11*4+@n10*5+@n9*6+@n8*7+@n7*8+@n6*9+@n5*2+@n4*3+@n3*4+@n2*5+@n1*6
Set @d2 = 11 - (@d2%11)
if (@d2>=10)
Set @d2 = 0


Select
Cast(@n1 as VarChar)+
Cast(@n2 as VarChar)+'.'+
Cast(@n3 as VarChar)+
Cast(@n4 as VarChar)+
Cast(@n5 as VarChar)+'.' +
Cast(@n6 as VarChar)+
Cast(@n7 as VarChar)+
Cast(@n8 as VarChar)+'/'+
Cast(@n9 as VarChar)+
Cast(@n10 as VarChar)+
Cast(@n11 as VarChar)+
Cast(@n12 as VarChar)+'-'+
Cast(@d1 as VarChar)+
Cast(@d2 as VarChar)

Gerar CPF Válido

Por razões obvias de segurança de informação nós temos que trocar alguns dados (scramble) de informações confidenciais quando atualizamos as bases de desenvolvimento e homologação. Uma delas é o CPF, essa rotina cria CPFs validos e randomicos:



Declare @n Int, @n1 Int, @n2 Int, @n3 Int, @n4 Int, @n5 Int, @n6 Int, @n7 Int, @n8 Int, @n9 Int
Declare @d1 Int, @d2 Int

Declare @NumeroCPFs Int

Create Table #TabelaCPF (sCPF VarChar(14))

Set @NumeroCPFs = 1000

While @NumeroCPFs > 0
Begin
Set @n = 9;
Set @n1 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n2 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n3 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n4 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n5 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n6 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n7 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n8 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @n9 = Cast((@n + 1) * RAND(CAST(NEWID() AS varbinary )) as int)
Set @d1 = @n9*2+@n8*3+@n7*4+@n6*5+@n5*6+@n4*7+@n3*8+@n2*9+@n1*10;
Set @d1 = 11 - (@d1%11);
if (@d1>=10)
Set @d1 = 0
Set @d2 = @d1*2+@n9*3+@n8*4+@n7*5+@n6*6+@n5*7+@n4*8+@n3*9+@n2*10+@n1*11;
Set @d2 = 11 - ( @d2%11 );
if (@d2>=10)
Set @d2 = 0;

Insert Into #TabelaCPF Values (
Cast(@n1 as VarChar)+
Cast(@n2 as VarChar)+
Cast(@n3 as VarChar)+'.'+
Cast(@n4 as VarChar)+
Cast(@n5 as VarChar)+
Cast(@n6 as VarChar)+'.'+
Cast(@n7 as VarChar)+
Cast(@n8 as VarChar)+
Cast(@n9 as VarChar)+'-'+
Cast(@d1 as VarChar)+
Cast(@d2 as VarChar))

Set @NumeroCPFs = @NumeroCPFs - 1

End


Select * from #TabelaCPF

Drop Table #TabelaCPF

Recuperar banco em Suspect

Aproveitando o assunto Apagão, como o que aconteceu essa madrugada (10/11/2009) em SP e mais um monte de lugares, é até comum, quando há problemas com os NoBreaks e Geradores, ocorrer algum problema com os servidores de banco de dados e eles voltarem como Suspects.

Basicamente, se não houver problemas muito mais sérios, a receita é:


EXEC sp_resetstatus 'Nome_BancoDados';

ALTER DATABASE Nome_BancoDados SET EMERGENCY

DBCC checkdb('Nome_BancoDados')

ALTER DATABASE Nome_BancoDados SET SINGLE_USER WITH ROLLBACK IMMEDIATE

DBCC CheckDB ('Nome_BancoDados', REPAIR_ALLOW_DATA_LOSS)

ALTER DATABASE Nome_BancoDados SET MULTI_USER

sexta-feira, 6 de novembro de 2009

Renomear os arquivos e nome lógico dos arquivos de um banco.

Select Name, Physical_Name
from BDDesenvOld.Sys.Database_files

Name Physical_Name
------------------- ----------------------------------
BDDesenv_Temp E:\DataSQL\BDDesenv.mdf
BDDesenv_Temp_log E:\DataSQL\BDDesenv_log.ldf



USE master
GO
ALTER DATABASE BDDesenvOld SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE BDDesenvOld
MODIFY FILE (NAME = BDDesenv_Temp, NEWNAME = BDDesenvOld, FILENAME = 'E:\DataSQL\BDDesenvOld.mdf')
GO
ALTER DATABASE BDDesenvOld
MODIFY FILE (NAME = BDDesenv_Temp_log, NEWNAME = BDDesenvOld_log, FILENAME = 'E:\DataSQL\BDDesenvOld_log.ldf')
GO
alter database BDDesenvOld set offline
GO
/*

Agora tem que renomear o arquivo na mão pelo SO

*/

alter database BDDesenvOld set Online
GO
ALTER DATABASE BDDesenvOld SET multi_user





Select Name, Physical_Name
from BDDesenvOld.Sys.Database_files


Name Physical_Name
--------------------- -------------------------------------
BDDesenvOld E:\DataSQL\BDDesenvOld.mdf
BDDesenvOld_log E:\DataSQL\BDDesenvOld_log.ldf

Renomear um database.

Para renomear um banco de dados "em voo", primeiro você precisa deixar o banco de dados em modo exclusivo, para que ninguem mais conecte.

Este procedimento não renomeia o nome fisico do arquivo, somente o nome do banco no SQLServer.


USE [master]
GO

ALTER DATABASE DBDesenv SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE DBDesenv MODIFY NAME = DBDesenvOld
GO
ALTER DATABASE DBDesenvOld SET multi_user

Como mover um banco de dados

As vezes, por manutenções em servidores, é necessário mover os arquivos de um banco de dados de uma pasta/drive para outro lugar.

Isso é facilmente resolvido por um detach / atach.



use BDDesenvolvimento

--Para saber exatamente onde o arquivo está.
sp_helpfile

name fileid filename filegroup size maxsize growth usage
---------------------- ------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------ ------------------ ---------
BDDesenvolvimento 1 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BDDesenvolvimento.mdf PRIMARY 13312 KB Unlimited 10240 KB data only
BDDesenvolvimento_log 2 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\BDDesenvolvimento_log.ldf NULL 5696 KB 2147483648 KB 10% log only


use master
go

--Desvincule o banco de dados do servidor:
sp_detach_db 'BDDesenvolvimento'

go

/*Depois, copie os arquivos de dados e de log do local atual (D:\Mssql7\Data) para um novo local (E:\Sqldata). */

use master
go
--Vincule novamente o banco de dados.
sp_attach_db 'BDDesenvolvimento','e:\DataSQL\BDDesenvolvimento.mdf','e:\LogsSQL\BDDesenvolvimento_log.ldf'
go


use BDDesenvolvimento
GO

--Verifique o novo caminho do banco.
sp_helpfile

name fileid filename filegroup size maxsize growth usage
--------------------- ------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------ ------------------ ---------
BDDesenvolvimento 1 e:\DataSQL\BDDesenvolvimento.mdf PRIMARY 13312 KB Unlimited 10240 KB data only
BDDesenvolvimento_log 2 e:\LogsSQL\BDDesenvolvimento_log.ldf NULL 5696 KB 2147483648 KB 10% log only

Listar as instancias de SQLServer do dominio.

Esta rotina utiliza o OSQL via cmdshell para listar todas as instancias (servidores) SQLServer disponíveis na sua rede.
Lembrando que para utilizar o cmdshell, talvez você precise liberar o acesso no seu servidor.

Declare @SQL as Varchar(100)

If Object_ID('tempdb..#InstanciasSQL') is Not Null
Begin
Drop Table #InstanciasSQL
End

CREATE TABLE #InstanciasSQL ([FName] NVARCHAR(1000))

SET @SQL = 'EXEC XP_CMDSHELL "OSQL -L"'

Insert Into #InstanciasSQL
Exec(@SQL)

Select LTrim(RTrim(FName))
from #InstanciasSQL
Where LTrim(RTrim(FName)) Not in ('Servers:')
And FName is not null

Log de execução do Maintenance Plan

Esse script facilita muito para saber o log de erro na execução de um Maintenance Plan.


With UltimaExecucao as (
Select A.Plan_Id, Max(A.Start_Time) as DataExec
from msdb..sysmaintplan_log A
Inner Join msdb..sysmaintplan_plans B On A.Plan_Id = B.id
Where B.name = 'OrgDiario' --Aqui vai o nome do seu MP
Group by A.Plan_Id)
Select C.Name,
C.Owner,
Case when D.succeeded = 1 then 'True' else 'False' End as Succeeded,
D.line1,
D.line2,
D.line3,
D.line4,
D.line5,
D.start_time,
D.end_time,
D.error_number,
D.error_message
From UltimaExecucao A
Inner Join msdb..sysmaintplan_log B On A.Plan_Id = B.Plan_Id
And A.DataExec = B.start_time
Inner Join msdb..sysmaintplan_plans C On C.id = A.Plan_Id
Inner Join msdb..sysmaintplan_logdetail D On D.task_detail_id = B.task_detail_id

Script para saber quais Backups foram executados e quando

Select B.backup_start_date,
B.backup_finish_date,
B.database_name as source_database_name,
C.physical_device_name as backup_file_used_for_restore
From msdb..backupset B
INNER JOIN msdb..backupmediafamily C ON B.media_set_id = C.media_set_id
Order by B.backup_start_date DESC

Script para saber quais Restores foram executados e quando

Select A.destination_database_name,
A.restore_date,
B.backup_start_date,
B.backup_finish_date,
B.database_name as source_database_name,
C.physical_device_name as backup_file_used_for_restore
From msdb..restorehistory A
INNER JOIN msdb..backupset B ON A.backup_set_id = B.backup_set_id
INNER JOIN msdb..backupmediafamily C ON B.media_set_id = C.media_set_id
Order by A.restore_date DESC

Cálculo de Feriados Móveis

Seguindo regras de cálculos já bastante conhecidas na internet, segue implementação em SQLServer dos feriados móveis no Brasil.


Declare @ano int

Set @ano = 2009

DECLARE
@seculo INT,
@G INT,
@K INT,
@I INT,
@H INT,
@J INT,
@L INT,
@MesDePascoa INT,
@DiaDePascoa INT,
@pascoa smalldatetime


SET @seculo = @ano / 100
SET @G = @ano % 19
SET @K = ( @seculo - 17 ) / 25
SET @I = ( @seculo - CAST(@seculo / 4 AS int) - CAST(( @seculo - @K ) / 3 AS int) + 19 * @G + 15 ) % 30
SET @H = @I - CAST(@I / 28 AS int) * ( 1 * -CAST(@I / 28 AS int) * CAST(29 / ( @I + 1 ) AS int) ) * CAST(( ( 21 - @G ) / 11 ) AS int)
SET @J = ( @ano + CAST(@ano / 4 AS int) + @H + 2 - @seculo + CAST(@seculo / 4 AS int) ) % 7
SET @L = @H - @J
SET @MesDePascoa = 3 + CAST(( @L + 40 ) / 44 AS int)
SET @DiaDePascoa = @L + 28 - 31 * CAST(( @MesDePascoa / 4 ) AS int)
SET @pascoa = CAST(@MesDePascoa AS varchar(2)) + '-' + CAST(@DiaDePascoa AS varchar(2)) + '-' + CAST(@ano AS varchar(4))


Select @pascoa as 'Pascoa',
DateAdd(dd, -3, @pascoa) as 'Sexta-Feira Paixao',
DateAdd(dd, -47, @pascoa) as 'Quarta Carnaval',
DateAdd(dd, 60, @pascoa) as 'CORPUS CHRISTI'

Miudezas Parte 4: Caminho do arquivo fisico do bd.

/*
Select * from sys.database_files

Select * from sys.Master_Files

Select * from Sys.Databases

*/

Select A.Database_id,
A.Type_Desc as 'Tipo',
B.Name as 'Banco',
A.Name as 'Nome Arquivo',
A.Physical_Name as 'Caminho Arquivo'
from Sys.Master_Files A
Inner Join Sys.Databases B On A.Database_Id = B.Database_Id
Order by B.Name, Tipo DESC

Métodos Hexadecimal em SQLServer

/*

Representação String to Hex

*/
DECLARE @HEXB AS varbinary(1000) ,
@HEXV AS varchar(1000)

-- Convert hexstring value in a variable to varbinary:

DECLARE @hexstring varchar(max) ;
SET @hexstring = 'abcedf012439' ;
SELECT @HEXB =
CAST('' AS xml).value('xs:hexBinary( substring(sql:variable("@hexstring"), sql:column("t.pos")) )' , 'varbinary(max)')
FROM
( SELECT
CASE substring(@hexstring , 1 , 2)
WHEN '0x' THEN 3
ELSE 0
END ) AS t ( pos )

Select @HEXB,
SQL_VARIANT_PROPERTY(@HEXB,'BaseType') AS '@HEXB Base Type'
GO


/*

Hex p/ representação em string - Function não documentada

*/
select master.dbo.fn_varbintohexstr(@HEXB) as String

--OU

DECLARE @hexbin varbinary(max)
SET @hexbin = 0xabcedf012439
Set @HEXV = '0x' + CAST('' AS xml).value('xs:hexBinary(sql:variable("@hexbin") )' , 'varchar(max)')
Select @HEXV,
SQL_VARIANT_PROPERTY(@HEXV,'BaseType') AS '@HEXV Base Type'
GO


/*

Valor correspondente em string/int

*/

DECLARE @HEXB AS varbinary(1000),
@charvalue as VarChar(1000)
Set @HEXB = 0x46617573746F

declare @vc varchar(8)
declare @vi Int
declare @vb varbinary(8)

set @vb = @HEXB
set @vc = CONVERT(varchar(8),@vb,2)

SELECT @vb, @vc

set @vb = 0x000000C1
set @vc = CONVERT(Int,@vb,2)
SELECT @vb, @vc


/*

Hex p/ representação em string

*/

DECLARE @HEXB AS varbinary(1000),
@charvalue as VarChar(1000)
Set @HEXB = 0x193

Set @charvalue = '0x' + cast('' as xml).value('xs:hexBinary(sql:variable("@HEXB") )', 'varchar(max)');

SELECT SQL_VARIANT_PROPERTY(@charvalue,'BaseType') AS '@charvalue Base Type',
SQL_VARIANT_PROPERTY(@charvalue,'Precision') AS '@charvalue Precision',
SQL_VARIANT_PROPERTY(@charvalue,'Scale') AS '@charvalue Scale',
SQL_VARIANT_PROPERTY(@charvalue,'MaxLength') AS '@charvalue MaxLength',
@charvalue as '@charvalue Valor'

SELECT


/*

Conversão de String / Int p/ HEX


*/

declare @hexstring varchar(max);
set @hexstring = '193';

select CONVERT(varbinary(max), @hexstring, 1);

set @hexstring = '193';
select CONVERT(varbinary(max), @hexstring, 2);

declare @hexInt Int;
set @hexInt = '193';
select CONVERT(varbinary(max), @hexInt, 2);