XML com SQL Server 2000 – Parte 02

Anderson Haertel Rodrigues

Como extrair dados no formato XML de tabelas no SQL Server 2000

O SQL Server 2000 conversa nativamente com o XML. O objetivo desse artigo é demonstrar a utilização do XML. Para exemplificar essa interação, a tabela tab_exemplo_xml será criada no database Northwind com o auxílio do Query Analyzer, conforme script da Listagem 3.

Listagem 3 . Criação e população da tabela tab_exemplo_xml.

19-07-2007pic01.JPG

Após a criação da tabela, utilizaremos um comando SELECT para extração dos dados no formato XML (ver Listagem 4).

Listagem 4. Extraindo dados de uma tabela no formato XML AUTO.

19-07-2007pic02.JPG

A sintaxe geral do SELECT FOR XML é a seguinte:

SELECT <COLUNA1,COLUNA,....,coluna-n>

FROM TABELA

FOR XML <MODE>{XMLDATA| ELEMENTS| BINARY BASE64}

Especifica o modo como o XML irá formatar o resultado. Pode ser: RAW, AUTO ou EXPLICIT:

RAW: Cada linha da tabela é um elemento . As colunas são atributos do elemento(ver Listagem 5).

Listagem 5. Extraindo dados no formato XML RAW.
19-07-2007pic03.JPG

AUTO: Cada linha é um elemento (TAG). O nome do elemento é nome do objeto (tabela do SQL Server). Cada coluna da linha de dados é um atributo do elemento. O modo AUTO retorna os resultados como uma árvore XML aninhada (ver Listagem 6). Quando utilizar AUTO ou RAW? Se você quiser explicitar a origem dos dados, isto é, a tabela à partir do qual o dado foi extraído utilize AUTO, caso contrário RAW será suficiente.

Listagem 6. XML AUTO.
19-07-2007pic04.JPG

oEXPLICIT: Com a utilização da cláusula EXPLICIT conseguimos "formatar" o documento XML retornado na query (ver Listagem 7). Para isso são necessárias algumas informações adicionais:

§ Deve-se descrever a hierarquia da árvore XML, "explicitando" quem é o pai e o filho na relação. Numa query com o modo EXPLICIT, a primeira coluna do SELECT é um tag number, caracterizado pelo nome <TAG>. Essa coluna é um inteiro e representa o elemento corrente.  Na segunda coluna deve-se explicitar o pai do elemento corrente com a utilização de <PARENT>(se igual a 0 ou NULL, esse elemento indicará o topo do relacionamento).

É necessário associar as colunas do comando SELECT com os tag numbers descritos anteriormente, respeitando-se a hierarquia do relacionamento (primeiro o pai depois o filho). Para expressar essa regra, deve-se escrever as colunas do SELECT no seguinte formato: [alias-do-elemento!tag-number!nome-da-coluna].

Listagem 7. Formatando a saída XML com a cláusula EXPLICIT.

19-07-2007pic05.JPG 

·XMLDATA [opcional]: retorna o schema do XML junto com o resultado do SELECT. O elemento raiz não é acrescentado ao result set; o schema é anexado ao documento (ver Listagem 8).

Listagem 8. Retornando o shema do XML com a cláusula XMLDATA.
19-07-2007pic06.JPG

·ELEMENTS: para cada registro, um elemento com o nome da tabela é aberto e fechado. Dentro desse elemento, as colunas e seus respectivos valores são apresentadas como novos elementos (ver Listagem 9).

Listagem 9. Formatando a saída XML com a cláusula ELEMENTS.

 19-07-2007pic07.JPG

·BINARY BASE64: se existirem colunas binárias na query e essa opção for utilizada, os dados dessas colunas serão listados tendo por base o formato BASE64-ENCONDED. Esse modo deve ser empregado sempre que utilizamos os modos RAW e EXPLICIT, sendo padrão para o modo AUTO.  Na Listagem 10 podemos observar o que acontece quando tentamos listar uma tabela que possui dados binários (PUBS.DBO.PUB_INFO) utilizando a formatação RAW sem BINARY BASE 64.

Listagem 10. Tentativa de listar coluna binária com FOR XML RAW sem BINARY BASE 64

19-07-2007pic08.JPG 

Incluindo a cláusula BINARY BASE64, o  SELECT será executado corretamente (ver Listagem 11).

Listagem 11. Listando dados binários com FOR XML RAW em conjunto com BINARY BASE 64.

19-07-2007pic09.JPG 

Podemos verificar que a saída com a formatação BINARY BASE64 não é das “mais adequadas” para leituras, mas nada impede que utilizemos em conjunto uma linguagem de programação com um componente adequado para visualização de imagens.

 

Até aqui vimos como recuperar dados contidos nas tabelas SQL Server 2000 no formato XML. Agora faremos o inverso, isto é, armazenaremos dados XML em tabelas do SQL Server.