Partilhar via


Especificar metapropriedades em OPENXML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Atributos de metapropriedade em um documento XML são atributos que descrevem as propriedades de um item XML, como elemento, atributo ou qualquer outro nó DOM. Esses atributos não existem fisicamente no texto do documento XML. No entanto, OPENXML fornece essas metapropriedades para todos os itens XML. Essas metapropriedades permitem extrair informações, como posicionamento local e informações de namespace, de nós XML. Esta informação fornece-lhe mais detalhes do que é aparente na representação textual.

Você pode mapear essas metapropriedades para as colunas do conjunto de linhas em uma instrução OPENXML usando o parâmetro ColPattern. As colunas conterão os valores das metapropriedades para as quais estão mapeadas. Para obter mais informações sobre a sintaxe de OPENXML, consulte OPENXML (Transact-SQL).

Para acessar os atributos de metapropriedade, um namespace específico para o SQL Server é fornecido. Este namespace, urn:schemas-microsoft-com:xml-metaprop permite que o usuário acesse os atributos de metapropriedade. Se o resultado de uma consulta OPENXML for retornado em um formato de tabela de borda, a tabela de borda conterá uma coluna para cada atributo de metapropriedade, exceto a metapropriedade xmltext.

Alguns dos atributos de metapropriedade são usados para fins de processamento. Por exemplo, o atributo metaproperty xmltext é usado para tratamento de overflow. O tratamento de sobrecarga refere-se aos dados não consumidos e não processados no documento. Uma das colunas no conjunto de linhas gerado pelo OPENXML pode ser identificada como a coluna de estouro. Para fazer isso, mapeie-o para a metapropriedade xmltext usando o parâmetro ColPattern. Em seguida, a coluna recebe os dados em excesso. O parâmetro flags determina se a coluna contém todos os dados ou apenas os dados não consumidos.

A tabela a seguir lista os atributos de metapropriedade que cada elemento XML analisado possui. Esses atributos de metapropriedade podem ser acessados usando o namespace urn:schemas-microsoft-com:xml-metaprop. Qualquer valor que o usuário define diretamente no documento XML usando essas metapropriedades é ignorado.

Observação

Não é possível fazer referência a essas metapropriedades em nenhuma navegação XPath.

Atributo de Metapropriedade Descrição
@mp:id Fornece um identificador gerado pelo sistema, aplicável a todo o documento, do nó do DOM. Desde que o documento não seja reanalisado, este identificador refere-se ao mesmo nó XML.

Uma ID XML de 0 indica que o elemento é um elemento raiz. O seu identificador XML pai é NULL.
@mp:localname Armazena a parte local do nome do nó. É usado com um prefixo e um URI de namespace para nomear nós de elemento ou atributo.
@mp:namespaceuri Fornece o URI do namespace do elemento atual. Se o valor desse atributo for NULL, nenhum namespace estará presente
@mp:prefix Armazena o prefixo do namespace do nome do elemento atual.

Se nenhum prefixo estiver presente (NULL) e um URI for fornecido, isso indica que o namespace especificado é o namespace padrão. Se nenhum URI for fornecido, nenhum namespace será anexado.
@mp:prev Armazena o irmão anterior relativo a um nó. Isso fornece informações sobre a ordenação dos elementos no documento.

@mp:prev contém a ID XML do irmão anterior que tem o mesmo elemento pai. Se um elemento estiver na frente da lista de irmãos, @mp:prev será NULL.
@mp:xmltext Utilizado para fins de processamento. É a serialização textual do elemento e seus atributos, e também os subelementos, como usado no tratamento de estouro de OPENXML.

Esta tabela mostra as propriedades adicionais de pai fornecidas que permitem recuperar informações sobre a hierarquia.

Atributo de metapropriedade pai Descrição
@mp:parentid Corresponde a ../\@mp:id
@mp:parentlocalname Corresponde a ../\@mp:localname
@mp:parentnamespacerui Corresponde a ../\@mp:namespaceuri
@mp:parentprefix Corresponde a ../\@mp:prefix

Exemplos

Os exemplos a seguir ilustram como o OPENXML é usado para criar diferentes exibições de conjunto de linhas.

Um. Mapeie as colunas do conjunto de linhas OPENXML para as metapropriedades

Este exemplo usa OPENXML para criar uma exibição de conjunto de linhas do documento XML de exemplo. Especificamente, ele mostra como os vários atributos de metapropriedade podem ser mapeados para colunas de linhas em uma instrução OPENXML usando o parâmetro ColPattern.

A instrução OPENXML ilustra o seguinte:

  • A coluna id é mapeada para o atributo de metapropriedade @mp:id e indica que a coluna contém a ID XML exclusiva gerada pelo sistema do elemento.

  • A coluna parent é mapeada para @mp:parentid e indica que a coluna contém a ID XML do pai do elemento.

  • A coluna parentLocalName é mapeada para @mp:parentlocalname e indica que a coluna contém o nome local do pai.

Em seguida, a instrução SELECT retorna o conjunto de linhas fornecido por OPENXML:

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (id int '@mp:id',
            oid char(5),
            date datetime,
            amount real,
            parentIDNo int '@mp:parentid',
            parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;

Este é o resultado:

id   oid         date                amount    parentIDNo  parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer

B. Recuperar todo o documento XML

Neste exemplo, OPENXML é usado para criar uma exibição de conjunto de linhas de uma coluna do documento XML de exemplo. Esta coluna, Col1, é mapeada para a metapropriedade xmltext e torna-se uma coluna de estouro. Como resultado, a coluna recebe os dados não consumidos. Neste caso, é todo o documento.

Em seguida, a instrução SELECT retorna o conjunto de linhas completo.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
             satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
     <MyTag>Testing to see if all the subelements are returned</MyTag>
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
   WITH (Col1 ntext '@mp:xmltext')

Para recuperar o documento inteiro sem a declaração XML, a consulta pode ser especificada conforme mostrado a seguir:

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

A consulta retorna o elemento raiz que tem o nome root e os dados contidos nele.

C. Especificando a metapropriedade xmltext para recuperar os dados não consumidos em uma coluna

Este exemplo usa OPENXML para criar uma exibição de conjunto de linhas do documento XML de exemplo. O exemplo mostra como recuperar dados XML não consumidos mapeando o atributo de metapropriedade xmltext para uma coluna de conjunto de linhas em OPENXML.

A coluna comment é identificada como a coluna de estouro mapeando-a para a metapropriedade @mp:xmltext. O parâmetro de sinalizadores é definido como 9 (XML_ATTRIBUTE e XML_NOCOPY). Isto indica o mapeamento attribute-centric e que apenas os dados não utilizados devem ser copiados para a coluna de estouro.

A instrução SELECT retorna o conjunto de linhas fornecido pelo OPENXML.

Neste exemplo, a metapropriedade @mp:parentlocalname é definida para uma coluna, ParentLocalName, no conjunto de linhas gerado por OPENXML. Como resultado, esta coluna contém o nome local do elemento pai.

Duas colunas adicionais são especificadas no conjunto de linhas, parent e comment. A coluna parent é mapeada para @mp:parentid e indica que a coluna contém a ID XML do elemento pai do elemento. A coluna de comentários é identificada como a coluna de overflow ao mapear para a metapropriedade @mp:xmltext.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (oid char(5),
            date datetime,
            comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;

Este é o resultado. Como as colunas oid e as colunas de datas já estão consumidas, elas não aparecem na coluna de excedente.

oid   date                        comment
----- --------------------------- ----------------------------------------
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very
                                   satisfied</Order>
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue
                                   white red"><Urgency>
                                   Important</Urgency></Order>
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>

Ver também