Armazenamento e transferência de dados via XML, XQuery

Dica do dia!

As vezes o DBA necessita transferir dados entre servidores de uma forma rápida. Quando falamos em transferência de dados, nós DBA´s já começamos a pensar nas ferramentas como: DTS, SSIS ou ferramentas de terceiros. (Não venho aqui desmerecer essas ferramentas que por sinal são bastante úteis, mas, vou demonstrar uma outra alternativa de transferência de dados de uma forma bastante simples e rápida).

A palavra chave é XML!

Sim, é simples; Ele é flexível; É poderoso. E você pode livremente copiar-colar-lo!]

Vejamos em simples passos como transferir resultados para outro servidor com pequenos passos:

Vamos supor que você precise verificar as configurações dos seus bancos de dados de uma instância. Você precisa armazenar essas informações para uma análise futura, fazer uma comparação de qual configuração foi modificada.

Primeiro: Converter dados para XML existente. Vejamos:

select name, user_access_desc, state_desc, recovery_model_desc, page_verify_option, GETDATE() as data
 from sys.databases
 order by name
 for xml auto

xml01

Segundo: Se você clicar na coluna de resultado com nome engraçado SSMS abrirá XML para visualização na janela nova XML:

xml02

Como você pode ver geramos simples “plain” XML sem qualquer elemento root (se você gosta de elementos de raiz você pode usar o argumento de raiz ).

Terceiro:  transferir XML para o servidor de destino.

Copia este resultado e cole no novo servidor. (Sim, velho e bom método do copy-paste). Muita gente não gosta, argumenta que é feio, etc.. A questão a se debater é sua eficiência, velocidade e o que eu considero primordial a praticidade. Assim sobra mais tempo para o café ou suas leituras de blogs como o este nosso e até mesmo desenvolver novas tarefas, porque não? 😉

Terceiro – usar  XQuery  para extrair dados de XML. (Destaque em preto para o XQuery)

declare @xml xml
 set @xml =
 '
 name="coleta_pdr" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 name="DBA" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="1" data="2014-12-29T10:41:32.380" />
 master" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 model" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="FULL" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 msdb" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 ReportServer$TSTSQLSERVER" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="FULL" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 ReportServer$TSTSQLSERVERTempDB" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 
 tempdb" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="SIMPLE" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 
 testeLogShipping" user_access_desc="MULTI_USER" state_desc="ONLINE" recovery_model_desc="FULL" page_verify_option="2" data="2014-12-29T10:41:32.380" />
 '
 select 
 b.value('@name','varchar(10)') as name
 ,b.value('@user_access_desc','varchar(15)') AS acesso
 ,b.value('@state_desc','varchar(15)') as status
 ,b.value('@recovery_model_desc','varchar(15)') as recovery
 ,b.value('@page_verify_option','varchar(15)') as Page_verify
 ,b.value('@data','date') as Date
from @xml.nodes('/sys.databases') a(b)

xml03

Fácil, não?

Você pode querer salvar a consulta por exemplo em uma temporária para poder trabalhar com os dados.

'
select
b.value('@name','varchar(10)') as name ,b.value('@user_access_desc','varchar(15)') AS acesso ,b.value('@state_desc','varchar(15)') as status ,b.value('@recovery_model_desc','varchar(15)') as recovery ,b.value('@page_verify_option','varchar(15)') as Page_verify ,b.value('@data','date') as Date
into #temp
from @xml.nodes('/sys.databases') a(b)

Usando XML você pode transferir não apenas os resultados da instrução simples de SELECT , mas, poderá fazer consultas complexas (mesmo – muito complexas) entidades com muitos objetos aninhados, camadas de dados e assim por diante.
Também usando XML você pode incorporar dados iniciais ou alguns valores de configuração / opções pré-definidas em scripts de criação para o seu banco de dados, sem necessidade de ter contato com todos esses BCP, SSIS e outras ferramentas de carga de dados.

Até a próxima!

Marcado com: , , , , , , , , , , , , , , , , , , , , , , , , , ,
Publicado em Administração SQL, Scripts, SQL SERVER

Deixe um comentário

Arquivos
Follow SQL DATA BLOG on WordPress.com