Compartilhar via


Utilize o modo EXPLICIT com FOR XML

Conforme descrito no tópico, A Construção de XML Usando FOR XML, os modos RAW e AUTO não fornecem muito controle sobre a forma do XML gerado a partir de um resultado de consulta. No entanto, o modo EXPLICIT fornece a maior flexibilidade na geração do XML desejado de um resultado de consulta.

A consulta de modo EXPLICIT deve ser escrita de uma maneira específica para que as informações adicionais sobre o XML necessário, como aninhamento esperado no XML, sejam explicitamente especificadas como parte da consulta. Dependendo do XML solicitado, a gravação de consultas no modo EXPLICIT pode ser complicada. Você pode descobrir que usar o modo PATH com aninhamento é uma alternativa mais simples para escrever consultas no modo EXPLICIT.

Como você descreve o XML desejado como parte da consulta no modo EXPLICIT, você deve garantir que o XML gerado seja bem formado e válido.

Processamento de conjunto de linhas no modo EXPLICIT

O modo EXPLICIT transforma o conjunto de linhas resultante da execução da consulta em um documento XML. Para que o modo EXPLICIT produza o documento XML, o conjunto de linhas deve ter um formato específico. Isso requer que você escreva a consulta SELECT para produzir o conjunto de linhas, a tabela universal, com um formato específico para que a lógica de processamento possa produzir o XML desejado.

Primeiro, a consulta deve produzir as duas colunas de metadados a seguir:

  • A primeira coluna deve fornecer o número da etiqueta, do tipo inteiro, do elemento atual, e o nome da coluna deve ser Tag. Sua consulta deve fornecer um número de etiqueta exclusivo para cada elemento que será construído a partir do conjunto de registros.

  • A segunda coluna deve fornecer um número de marca do elemento pai e esse nome de coluna deve ser Pai. Dessa forma, a Tag e a coluna Pai fornecem informações de hierarquia.

Esses valores de coluna de metadados, juntamente com as informações nos nomes das colunas, são usados para produzir o XML desejado. Observe que sua consulta deve fornecer nomes de coluna de uma maneira específica. Observe também que um 0 ou NULL na coluna Pai indica que o elemento correspondente não tem pai. O elemento é adicionado ao XML como um elemento de nível superior.

Para entender como a tabela universal gerada por uma consulta é processada na geração de resultado XML, suponha que você tenha escrito uma consulta que produz esta tabela universal:

Exemplo de tabela universal

Observe o seguinte sobre esta tabela universal:

  • As duas primeiras colunas são Tag e Parent e são meta-colunas. Esses valores determinam a hierarquia.

  • Os nomes de coluna são especificados de uma determinada maneira, conforme descrito posteriormente neste tópico.

  • Ao gerar o XML dessa tabela universal, os dados nesta tabela são particionados verticalmente em grupos de colunas. O agrupamento é determinado com base no valor do Tag e nos nomes das colunas. Na construção de XML, a lógica de processamento seleciona um grupo de colunas para cada linha e constrói um elemento. O seguinte se aplica neste exemplo:

    • Para o valor 1 na primeira linha da coluna Tag, as colunas cujos nomes incluem o mesmo número de tag, Customer!1!cid e Customer!1!name, formam um grupo. Essas colunas são usadas no processamento da linha e você deve ter notado que a forma do elemento gerado é <Customer id=... name=...>. O formato de nome da coluna é descrito posteriormente neste tópico.

    • Para linhas com valor na coluna Tag igual a 2, as colunas Order!2!id e Order!2!date formam um grupo que é então usado na construção de elementos, <Order id=... date=... />.

    • Para linhas com o valor da coluna Tag igual a 3, as colunas OrderDetail!3!id!id e OrderDetail!3!pid!idref formam um grupo. Cada uma dessas linhas gera um elemento, <OrderDetail id=... pid=...>a partir dessas colunas.

  • Observe que, ao gerar a hierarquia XML, as linhas são processadas em ordem. A hierarquia XML é determinada conforme mostrado no seguinte:

    • A primeira linha especifica Tag valor 1 e Parental valor NULL. Portanto, o elemento correspondente, <Customer> elemento, é adicionado como um elemento de nível superior no XML.

      <Customer cid="C1" name="Janine">  
      
    • A segunda linha identifica o valor tag 2 e o valor parent 1. Portanto, o elemento, <Order> elemento, é adicionado como um filho do <Customer> elemento.

      <Customer cid="C1" name="Janine">  
         <Order id="O1" date="1/20/1996">  
      
    • As duas próximas linhas identificam o Tag valor 3 e o Parent valor 2. Portanto, os dois elementos, <OrderDetail> elementos, são adicionados como filhos do <Order> elemento.

      <Customer cid="C1" name="Janine">  
         <Order id="O1" date="1/20/1996">  
            <OrderDetail id="OD1" pid="P1"/>  
            <OrderDetail id="OD2" pid="P2"/>  
      
    • A última linha identifica 2 como o número da tag e 1 como o número da tag pai. Portanto, outro elemento filho <Order> é adicionado ao elemento pai <Customer>.

      <Customer cid="C1" name="Janine">  
         <Order id="O1" date="1/20/1996">  
            <OrderDetail id="OD1" pid="P1"/>  
            <OrderDetail id="OD2" pid="P2"/>  
         </Order>  
         <Order id="O2" date="3/29/1997">  
      </Customer>  
      

Para resumir, os valores nas meta-colunas Tag e Parent , as informações fornecidas nos nomes das colunas e a ordenação correta das linhas produzem o XML desejado quando você usa o modo EXPLICIT.

Ordenação de linha de tabela universal

Na construção do XML, as linhas na tabela universal são processadas em ordem. Portanto, para recuperar as instâncias corretas de filhos associadas ao seu pai, as linhas no conjunto de registros devem ser ordenadas de modo que cada nó pai seja imediatamente seguido por seus filhos.

Especificando nomes de coluna em uma tabela universal

Ao escrever consultas de modo EXPLICIT, os nomes de coluna no conjunto de linhas resultante devem ser especificados usando esse formato. Eles fornecem informações de transformação, incluindo nomes de elementos e atributos e outras informações adicionais, especificadas usando diretivas.

Este é o formato geral:

  
ElementName!TagNumber!AttributeName!Directive  

Veja a seguir a descrição das partes do formato.

ElementName
É o identificador genérico resultante do elemento. Por exemplo, se Customers for especificado como ElementName, o <elemento Customers> será gerado.

TagNumber
É um valor de marca exclusivo atribuído a um elemento. Esse valor, com a ajuda das duas colunas de metadados, Tag e Parent, determina o aninhamento dos elementos no XML resultante.

AttributeName
Fornece o nome do atributo a ser construído no ElementName especificado. Esse é o comportamento se a diretiva não for especificada.

Se a Diretiva for especificada e for xml, cdata ou elemento, esse valor será usado para construir um filho de elemento de ElementName e o valor da coluna será adicionado a ele.

Se você especificar a Diretiva, o AttributeName poderá estar vazio. Por exemplo, ElementName!TagNumber!!Diretiva. Nesse caso, o valor da coluna está diretamente contido pelo ElementName.

Diretiva
A diretiva é opcional e você pode usá-la para fornecer informações adicionais para a construção do XML. A diretiva tem duas finalidades.

Uma das finalidades é codificar valores como ID, IDREF e IDREFS. Você pode especificar palavras-chave ID, IDREF e IDREFS como Diretivas. Essas diretivas substituem os tipos de atributo. Isso permite que você crie links dentro do documento.

Além disso, você pode usar Directive para indicar como mapear os dados da cadeia de caracteres para XML. As palavras-chave hide, element, elementxsinil, xml, xmltext e cdata podem ser usadas como a Diretiva. A diretiva hide oculta o nó. Isso é útil quando você recupera valores apenas para fins de classificação, mas não os deseja no XML resultante.

A diretiva de elemento gera um elemento contido em vez de um atributo. Os dados contidos são codificados como uma entidade. Por exemplo, o < caractere se torna <. Para valores de coluna NULL, nenhum elemento é gerado. Se você quiser que um elemento seja gerado para valores nulos de coluna, especifique a diretiva elementxsinil . Isso gerará um elemento que tem o atributo xsi:nil=TRUE.

A diretiva xml é a mesma que uma diretiva de elemento , exceto que não ocorre nenhuma codificação de entidade. Observe que a diretiva de elemento pode ser combinada com ID, IDREF ou IDREFS, enquanto a diretiva xml não é permitida com nenhuma outra diretiva, exceto ocultar.

A diretiva cdata contém os dados encapsulando-os com uma seção CDATA. O conteúdo não está codificado em entidades HTML. O tipo de dados original deve ser um tipo de texto como varchar, nvarchar, texto ou ntext. Essa diretiva só pode ser usada com ocultação. Quando essa diretiva é usada, AttributeName não deve ser especificado.

A combinação de diretivas entre esses dois grupos é permitida na maioria dos casos, mas combiná-las entre si não é permitida.

Se a diretiva ou o AttributeName não forem especificados, por exemplo, Customer!1, uma diretiva de elemento estará implícita, como Customer!1!!elemento, e os dados da coluna estão contidos no ElementName.

Se a diretiva xmltext for especificada, o conteúdo da coluna será encapsulado em uma única marca integrada ao restante do documento. Essa diretiva é útil na busca de dados XML excedentes e não consumidos armazenados em uma coluna pelo OPENXML. Para obter mais informações, consulte OPENXML (SQL Server).

Se AttributeName estiver especificado, o nome da etiqueta será substituído pelo nome especificado. Caso contrário, o atributo será acrescentado à lista atual de atributos dos elementos delimitados colocando o conteúdo no início da contenção sem codificação de entidade. A coluna com essa diretiva deve ser um tipo de texto, como varchar, nvarchar, char, nchar, text ou ntext. Essa diretiva só pode ser usada com ocultação. Essa diretiva é útil na busca de dados excedentes localizados em uma coluna. Se o conteúdo não for um XML bem formado, o comportamento será indefinido.

Nesta seção

Os exemplos a seguir ilustram o uso do modo EXPLICIT.

Consulte Também

Usar o modo RAW com FOR XML
Usar o modo AUTO com FOR XML
Usar o modo PATH com FOR XML
SELECT (Transact-SQL)
FOR XML (SQL Server)