Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Como descrito no artigo, Construindo XML Usando FOR XML, os modos RAW e AUTO não oferecem muito controlo sobre a forma do XML gerado a partir de um resultado de consulta. No entanto, o modo EXPLICIT oferece a maior flexibilidade na geração do XML desejado a partir de um resultado de consulta.
A consulta em modo EXPLICIT deve ser escrita de uma forma específica para que a informação adicional sobre o XML necessário, como o aninhamento esperado no XML, seja explicitamente especificada como parte da consulta. Dependendo do XML que solicita, escrever consultas em modo EXPLÍCITO pode ser complicado. Pode descobrir que Usar o Modo PATH com aninhamento é uma alternativa mais simples à escrita de consultas em modo EXPLÍCITO.
Como descreve o XML que pretende como parte da consulta em modo EXPLÍCITO, deve garantir que o XML gerado está bem formado e válido.
Processamento de linhas em modo EXPLÍCITO
O modo EXPLICIT transforma o conjunto de linhas resultante da execução da consulta num documento XML. Para que o modo EXPLICIT produza o documento XML, o conjunto de linhas deve ter um formato específico. Isto requer que escrevas a query SELECT para produzir o conjunto de linhas, a tabela universal, com um formato específico para que a lógica de processamento possa então produzir o XML que queres.
Primeiro, a consulta deve produzir as seguintes duas colunas de metadados:
A primeira coluna deve fornecer o número da etiqueta, o tipo inteiro do elemento atual, e o nome da coluna deve ser Etiqueta. A sua consulta deve fornecer um número de etiqueta único para cada elemento que será construído a partir do conjunto de linhas.
A segunda coluna deve fornecer um número de etiqueta do elemento pai, e o nome dessa coluna deve ser Pai. Desta forma, a Etiqueta e a coluna Pai fornecem informação sobre a hierarquia.
Estes valores das colunas dos metadados, juntamente com a informação nos nomes das colunas, são usados para produzir o XML que pretende. A sua consulta deve fornecer nomes de colunas de uma forma específica. Note 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 elemento de topo.
Para compreender como a tabela universal gerada por uma consulta é processada para gerar um resultado XML, assuma que escreveu uma consulta que produz esta tabela universal:
Note o seguinte sobre esta tabela universal:
As duas primeiras colunas são Tag e Parent e são colunas meta. Estes valores determinam a hierarquia.
Os nomes das colunas são especificados de uma certa forma, conforme descrito mais adiante neste artigo.
Ao gerar o XML a partir desta tabela universal, os dados desta tabela são particionados verticalmente em grupos de colunas. O agrupamento é determinado com base no valor da etiqueta e nos nomes das colunas. Ao construir XML, a lógica de processamento seleciona um grupo de colunas para cada linha e constrói um elemento. O seguinte aplica-se neste exemplo:
Para o valor da coluna 1 da etiqueta na primeira linha, as colunas cujos nomes incluem o mesmo número de etiqueta, Customer!1!cid e Customer!1!name, formam um grupo. Estas colunas são usadas no processamento da linha, e pode ter reparado que a forma do elemento gerado é
<Customer id=... name=...>. O formato do nome das colunas é descrito mais adiante neste artigo.Para linhas com valor 2 na coluna Tag, as colunas Order!2!id e Order!2!date formam um grupo que é depois usado na construção dos elementos
<Order id=... date=... />.Para linhas com valor da coluna Tag 3, as colunas OrderDetail!3!id!id e OrderDetail!3!pid!idref formam um grupo. Cada uma destas linhas gera um elemento,
<OrderDetail id=... pid=...>, a partir destas colunas.
Na geração da hierarquia XML, as linhas são processadas por ordem. A hierarquia XML é determinada conforme mostrado no seguinte:
A primeira linha especifica Tag valor 1 e Parent valor NULL. Portanto, o elemento correspondente,
<Customer>elemento, é adicionado como elemento de topo 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 filho do<Customer>elemento.<Customer cid="C1" name="Janine"> <Order id="O1" date="1/20/1996">As duas linhas seguintes identificam o valor Tag 3 e o valor Parent 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 número de etiqueta e 1 como número de etiqueta Pai . Portanto, outro
<Order>elemento filho é adicionado ao<Customer>elemento pai.<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>
Resumindo, os valores nas meta-colunas Tag e Parent , a informação fornecida nos nomes das colunas e a ordem correta das linhas produzem o XML que se pretende quando se usa o modo EXPLICIT.
Ordenação universal de linhas em tabelas
Na construção do XML, as linhas na tabela universal são processadas por ordem. Portanto, para recuperar as instâncias filhas corretas associadas ao respetivo pai, as linhas no conjunto de linhas devem ser ordenadas de modo a que cada nó pai seja imediatamente seguido pelos seus filhos.
Especificar nomes de colunas numa tabela universal
Ao escrever consultas em modo EXPLÍCITO, os nomes das colunas no conjunto de linhas resultante devem ser especificados usando este formato. Fornecem informação de transformação, incluindo nomes de elementos e atributos, e outras informações adicionais, especificadas através de diretivas.
Este é o formato geral:
ElementName!TagNumber!AttributeName!Directive
Segue-se a descrição das partes do formato.
ElementName
O identificador genérico resultante do elemento. Por exemplo, se Clientes for especificado como NomeElemento, o
<Customers>elemento é gerado.Número de Etiqueta
Um valor único de etiqueta atribuído a um elemento. Este 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 construir no NomeElemento especificado. Este é o comportamento se a Diretiva não for especificada.
Se a Diretiva for especificada e for xml, cdata ou element, este valor é usado para construir um filho de elemento do NomeElemento, e o valor da coluna é adicionado a ele.
Se especificar a Diretiva, o AttributeName pode ficar vazio. Por exemplo, ElementName!TagNumber!!Directive. Neste caso, o valor da coluna está diretamente contido pelo NomeDeElemento.
Diretiva
A diretiva é opcional e pode usá-la para fornecer informações adicionais sobre a construção do XML. A diretiva tem dois propósitos.
Um dos propósitos é codificar valores como ID, IDREF e IDREFS. Pode especificar palavras-chave ID,IDREF e IDREFS como Diretivas. Estas diretivas sobrescrevem os tipos de atributos. Isto permite-lhe criar links intra-documentos.
Além disso, pode usar Directive para indicar como mapear os dados de cadeia de caracteres para XML. As palavras-chave hide, element, elementxsinil, xml, xmltext e cdata podem ser usadas como a Diretiva. A diretiva ocultar esconde o nó. Isto é útil quando recuperas valores apenas para fins de ordenação, mas não os queres 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 < carácter torna-se <. Para valores de colunas NULL, nenhum elemento é gerado. Se quiseres um elemento gerado para valores de colunas nulas, podes especificar a diretiva elementxsinil . Isto gerará um elemento que tem o atributo xsi:nil=TRUE.
A diretiva xml é igual a uma diretiva elemental , exceto que não ocorre codificação de entidades. A diretiva element pode ser combinada com ID,IDREF ou IDREFS, enquanto a diretiva xml não é permitida com nenhuma outra diretiva, exceto hide.
A diretiva cdata contém os dados ao envolvê-los com uma secção CDATA. O conteúdo não é codificado por entidades. O tipo de dado original deve ser um tipo de texto como varchar, nvarchar, texto ou ntext. Esta diretiva só pode ser usada com hide. Quando esta diretiva é usada, AttributeName não deve ser especificado.
Combinar diretivas entre estes dois grupos é permitido na maioria dos casos, mas combiná-las entre si não é permitido.
Se a Diretiva e o Nome do Atributo não forem especificados, por exemplo, Cliente!1, é implícita uma diretiva de elemento , como Cliente!1!! element, e os dados das colunas estão contidos no NomeElemento.
Se a diretiva xmltext for especificada, o conteúdo da coluna é envolto numa única etiqueta que é integrada com o resto do documento. Esta diretiva é útil para recuperar dados XML não consumidos e excedentes armazenados numa coluna pelo OPENXML. Para mais informações, consulte OPENXML (SQL Server).
Se AttributeName for especificado, o nome da etiqueta é substituído pelo nome especificado. Caso contrário, o atributo é adicionado à lista atual de atributos dos elementos que o encerram, colocando o conteúdo no início da contenção sem codificação de entidade. A coluna com esta diretiva deve ser um tipo de texto, como varchar, nvarchar, char, nchar, text ou ntext. Esta diretiva só pode ser usada com hide. Esta diretiva é útil para obter dados excedentes armazenados numa coluna. Se o conteúdo não for um XML bem formado, o comportamento é indefinido.
Próximos passos
Os exemplos seguintes ilustram o uso do modo EXPLICIT.
- Exemplo: Recuperação de Informação do Funcionário
- Exemplo: Especificar a Diretiva ELEMENT
- Exemplo: Especificação da Diretiva ELEMENTXSINIL
- Exemplo: Construindo Irmãos com Modo EXPLÍCITO
- Exemplo: especificar as diretivas ID e IDREF
- Exemplo: especificar as diretivas ID e IDREFS
- Exemplo: Especificar a Diretiva HIDE
- Exemplo: Especificar a Diretiva ELEMENT e a Codificação de Entidades
- Exemplo: Especificação da Diretiva CDATA
- Exemplo: Especificação da Diretiva XMLTEXT