Recuperando o nome dos elementos em um documento XML no SQL Server

Boa Noite Pessoal,

Essa semana apareceu no fórum do MSDN uma thread bem interessante em relação a XML intitulada "Como descobrir qual a Tag "Mãe" de um XML". A pergunta era bem simples. Dado um certo documento XML, como fazer para descobrir o nome da tag root desse documento ? Tenho um certo interesse e facilidade com o assunto XML, mas essa pergunta (aparentemente bem fácil), me deu um certo nó para tentar responder. Depois de muito tentar montar uma expressão XQuery para retornar o nome da tag e procurado o Books OnLine por contas das funções XQuery permitidas (nem todo o padrão é implementado na íntegra), acabei me rendendo e indo buscar ajuda no Google. Minha alegria foi saber que após uma vasta pesquisa no google só encontrei uma solução baseada no CONVERT e no REPLACE. Minha tristeza foi simplesmente não encontrar uma solução baseada em XQuery.

Após postar a solução baseada puramente em TSQL acabei deixando essa questão um pouco de lado (minhas tentativas haviam sido frustadas até então). Eis que essa semana, ao iniciar a leitura de mais um livro de SQL Server (SQL Server MVP Deep Dives) acabei encontrando sem querer uma inspiração para a solução para esse problema. Ainda vou postar no MSDN, mas vamos reproduzir o exemplo.

declare @xml xml
set @xml = ‘<questionario>
    <Cod>0</Cod>
    <cod_item>1</cod_item>
    <cod_questionario>34</cod_questionario>
    <cod_pergunta>98</cod_pergunta>
    <cod_resposta>2</cod_resposta>
    <dat_resposta_text>1/1/1900 00:00:00</dat_resposta_text>
    <cod_tipo_objeto>1</cod_tipo_objeto>
    <cod_pergunta_condicao>0</cod_pergunta_condicao>
    <cod_resposta_condicao>0</cod_resposta_condicao>
  </questionario>’

Select Substring(XML,Charindex(‘<‘, XML)+1, Charindex(‘>’, XML) – Charindex(‘<‘, XML)-1) As Root
From (
 Select
 Cast(@xml as Varchar(Max)) As XML) As Data

Essa solução é capaz de retornar uma coluna root com o conteúdo questionario que é o nome da tag root. Essa solução é adaptada do link http://www.windows-tech.info/15/c0b6c1c5015db804.php. A dúvida era como fazer via XQuery ? Eu tenho algum conhecimento das funções de metadados, mas mesmo assim não consegui fazer funcionar. Adaptando um pouco a solução do livro, o correto seria a consulta abaixo:

declare @xml xml
set @xml = ‘<questionario>
    <Cod>0</Cod>
    <cod_item>1</cod_item>
    <cod_questionario>34</cod_questionario>
    <cod_pergunta>98</cod_pergunta>
    <cod_resposta>2</cod_resposta>
    <dat_resposta_text>1/1/1900 00:00:00</dat_resposta_text>
    <cod_tipo_objeto>1</cod_tipo_objeto>
    <cod_pergunta_condicao>0</cod_pergunta_condicao>
    <cod_resposta_condicao>0</cod_resposta_condicao>
  </questionario>’

SELECT node.value(N’fn:local-name(.[1])’, N’nvarchar(1000)’) As Root
FROM @xml.nodes(N'(//*)[1]’) T(node)

Avançando um pouco mais na solução, há uma consulta interessante.

declare @xml xml
set @xml = ‘<questionario>
    <Cod>0</Cod>
    <cod_item>1</cod_item>
    <cod_questionario>34</cod_questionario>
    <cod_pergunta>98</cod_pergunta>
    <cod_resposta>2</cod_resposta>
    <dat_resposta_text>1/1/1900 00:00:00</dat_resposta_text>
    <cod_tipo_objeto>1</cod_tipo_objeto>
    <cod_pergunta_condicao>0</cod_pergunta_condicao>
    <cod_resposta_condicao>0</cod_resposta_condicao>
  </questionario>’

SELECT
    node.value(N’fn:local-name(.[1])’, N’nvarchar(1000)’) AS NodeName,
    CAST(node.query(N’./text()’As VARCHAR(100)) As NodeValue
FROM @xml.nodes(N’//*’) T(node)

A consulta revela os elementos e seus respectivos valores conforme a tabela abaixo:

NodeName NodeValue
questionario  
Cod 0
cod_item 1
cod_questionario 34
cod_pergunta 98
cod_resposta 2
dat_resposta_text 1/1/1900 00:00:00
cod_tipo_objeto 1
cod_pergunta_condicao 0
cod_resposta_condicao 0

O crédito da inspiração vai para o MVP Michael Coles. Ele pode ser encontrado no link http://www.sergeantsql.com.

[ ]s,

Gustavo

2 Respostas para “Recuperando o nome dos elementos em um documento XML no SQL Server

  1. Gustavo, fantástico…. muito obrigado pela ajuda, acredito que esse tipo de artigo irá ajudar muitas pessoas. As vezes, muitos tem receio de implentar uma solução via xml, mesmo quando tudo aponta pra ela, devido a poucos exemplos e material disponível com exemplos práticos como esse. isso demonstra a qualidade das pessoas que compôe essa excelente comunidade SQL Server.Parabéns..

  2. Oi Cleyton,Eu também costumo utilizar XML para situações em que a "normalização empaca". De fato vejo uma certa carência de bons exemplos em XML na Internet e acho que por isso parece ser tão difícil. Eu coloquei alguns artigos de XML em: http://www.plugmasters.com.br/sys/colunistas/145/Gustavo-Maia-Aguiar. Acredito que vão ser bem úteis.Ajudar a comunidade SQL Server é sempre um prazerAbs,

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s