» Início » Desenvolvimento » Banco de dados e SQL » SQL Server 2005 New Features: A cláusula FOR XML
 
Avaliação: | Publicado em: 31/01/2007
SQL Server 2005 New Features: A cláusula FOR XML


FOR XML EXPLICIT

Essa é certamente a forma mais complexa da cláusula FOR XML, mas em muitas situações a única* capaz de retornar determinados resultados. Ainda que seja possível para as cláusulas FOR XML RAW e FOR XML AUTO retornar elementos ao invés de atributos**, em certas ocasiões, o layout do XML a ser retornado não pode ser montado com essas variações da cláusula FOR XML.

A variação EXPLICIT é baseada na combinação de consultas (UNION) e para que possa ser utilizada é necessária a criação de duas colunas de metadados. A primeira coluna serve como um identificador e deve ter o apelido (Alias) TAG. A segunda coluna funciona como um link entre os elementos filho e esse identificador e deve ter o apelido de PARENT.

SELECT
    1 AS TAG,
    NULL AS PARENT,
    Reg.RegiaoNome AS [Regiao!1!Nome],
    NULL AS [UF!2!Sigla],
    NULL AS [UF!2!Nome]
FROM
    Regiao AS REG
UNION ALL
SELECT
    2,
    1,
    Reg.RegiaoNome,
    Est.EstadoSigla,
    Est.EstadoNome
FROM
    Regiao AS REG
 INNER JOIN Estado AS EST
        ON REG.RegiaoID = EST.RegiaoID
ORDER BY
    [Regiao!1!Nome], [UF!2!Nome]
FOR XML EXPLICIT

O resultado da sentença SQL é:

<Regiao Nome="Centro Oeste">
  <UF Sigla="DF" Nome="Distrito Federal" />
  <UF Sigla="GO" Nome="Goiás" />
</Regiao>
<Regiao Nome="Nordeste">
  <UF Sigla="BA" Nome="Bahia" />
  <UF Sigla="RN" Nome="Rio Grande do Norte" />
</Regiao>
<Regiao Nome="Norte">
  <UF Sigla="AC" Nome="Acre" />
</Regiao>
<Regiao Nome="Sudeste">
  <UF Sigla="MG" Nome="Minas Gerais" />
  <UF Sigla="RJ" Nome="Rio de Janeiro" />
  <UF Sigla="SP" Nome="São Paulo" />
</Regiao>
<Regiao Nome="Sul">
  <UF Sigla="RS" Nome="Rio Grande do Sul" />
</Regiao>

Entender essa sintaxe não é uma tarefa das mais fáceis. Na primeira consulta (antes do UNION ALL), o identificador 1 é criado. Como ele não possuirá elementos superiores, o metadado “PARENT” é nulo. Na segunda parte da consulta o identificador é 2 e como os elementos são subordinados ao resultado da primeira consulta, o metadado “PARENT” é 1 que é o identificador da primeira consulta.

A expressão “[Regiao!1!Nome]” define que o primeiro elemento (identificador 1) se chamará “Regiao” e que existirá um atributo chamado “Nome”. A expressão [UF!2!Sigla] define que o elemento aninhado (identificador 2) ao elemento “Regiao” se chamará “UF” e existirá um elemento chamado “Sigla”. O mesmo raciocínio é válido para o atributo “Nome”.

* Logo a seguir será explicada outra forma de produzir documentos XML mais complexos
** Logo a seguir será explicado como transformar atributos em elementos


CLAUDIO DE CARVALHO <CLAUDIOCARVALHO@DEVIR.COM.BR>
Ajudou-me bastante ter o entendimento do assunto.
Ok, o documento é realmente muito esclarecedor. Porém estou com dificuldades para gerar isto em uma stored procedure. Realmente o FOR XML apenas pode ser usado para saida direta ao client? Não estou vendo uma saída prática para isto. Obrigado
Muito bom os comentários sobre a questão do uso do XPath, agora a dificuldade encontro quando estou armazenando informações em XML e gostaria de atualizá-las via XPath em um Campo Text por exemplo, ainda não encontrei uma forma de atualizar algum valor de um elemento baseado do ID de uma linha por exemplo. tipo ainda não encontrei uma função ou procedure que faça uma tarefa de fazer por exemplo um comando do tipo :
Update tabela_fisica set
campoxml = updatexml(campoxml,'Regiao/UF/Nome/Municipio',valornovo)
WHERE equals_path(campoxml,'Regiao/Nome') = 'Centro Oeste' and
equals_path(campoxml,'Regiao/UF') = 'GO' and equals_path(campoxml,'Regiao/UF/MUNICIPIO') = 'Araçu' por exemplo
Ainda estou a procura para o Uso no SQL Server 2000 senao tiver no 2005 server ???
aline carare candido <alinecarrare@hotmail.com>
bom de mais
Jose Orlando Rocha <orocha@correios.com.br>
Estou buscando importar arquivos XML para um banco de dados de uma aplicação que estamos desenvolvendo.
Pelo que li e entendi, penso que com o artigo poderei fazer a importação. Rocha