Partilhar via


Expressões de caminho - Especificando eixo

Aplica-se a:SQL Server

Uma etapa de eixo em uma expressão de caminho inclui os seguintes componentes:

Para obter mais informações, consulte Expressões de caminho (XQuery).

A implementação XQuery no SQL Server suporta as seguintes etapas de eixo,

Eixo Descrição
criança Retorna filhos do nó de contexto.
descendente Retorna todos os descendentes do nó de contexto.
pai Retorna o pai do nó de contexto.
atributo Retorna atributos do nó de contexto.
auto- Retorna o nó de contexto em si.
descendente ou Retorna o nó de contexto e todos os descendentes do nó de contexto.

Todos esses eixos, exceto o eixo pai, são eixos para frente. O eixo pai é um eixo inverso, porque ele pesquisa para trás na hierarquia de documentos. Por exemplo, a expressão de caminho relativo child::ProductDescription/child::Summary tem duas etapas e cada etapa especifica um eixo child. A primeira etapa recupera o <ProductDescription> elementos filhos do nó de contexto. Para cada nó de elemento> ProductDescription <, a segunda etapa recupera os filhos do nó <Summary> elemento.

A expressão de caminho relativo, child::root/child::Location/attribute::LocationID, tem três etapas. As duas primeiras etapas especificam cada uma um eixo child e a terceira etapa especifica o eixo attribute. Quando executada em relação aos documentos XML de instruções de fabricação na tabela Production.ProductModel, a expressão retorna o atributo LocationID do <Location> elemento filho filho do elemento> raiz <.

Exemplos

Os exemplos de consulta neste tópico são especificados em relação a colunas de tipo de xml no banco de dados AdventureWorks.

Um. Especificando um eixo filho

Para um modelo de produto específico, a consulta a seguir recupera os filhos do nó do elemento> Recursos <do nó do elemento <> ProductDescription da descrição do catálogo de produtos armazenada na tabela Production.ProductModel.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Observe o seguinte da consulta anterior:

  • O método query() do tipo de dados xml especifica a expressão de caminho.

  • Ambas as etapas na expressão de caminho especificam um eixo child e os nomes dos nós, ProductDescription e Features, como testes de nó. Para obter informações sobre testes de nó, consulte Especificando o teste de nó em uma etapa de expressão de caminho.

B. Especificação dos eixos descendente e descendente ou próprio

O exemplo a seguir usa os eixos descendente e descendente ou próprio. A consulta neste exemplo é especificada em relação a uma variável de tipo de xml. A instância XML é simplificada para ilustrar facilmente a diferença nos resultados gerados.

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
declare @y xml  
set @y = @x.query('  
  /child::a/child::b  
')  
select @y  

No resultado a seguir, a expressão retorna o filho do nó do elemento <b> do nó do elemento <a>:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  

Nesta expressão, se você especificar um eixo descendente para a expressão de caminho,

/child::a/child::b/descendant::*, você está pedindo todos os descendentes do nó <b> elemento.

O asterisco (*) no teste de nó representa o nome do nó como um teste de nó. Portanto, o tipo de nó primário do eixo descendente, o nó do elemento, determina os tipos de nós retornados. Ou seja, a expressão retorna todos os nós do elemento.. Os nós de texto não são retornados. Para obter mais informações sobre o tipo de nó primário e sua relação com o teste de nó, consulte tópico Especificando o teste de nó em uma etapa de expressão de caminho.

Os nós de elemento <c> e <d> são retornados, conforme mostrado no seguinte resultado:

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

Se você especificar um eixo descendente ou próprio em vez do eixo descendente, /child::a/child::b/descendant-or-self::* retornará o nó de contexto, o elemento <b>e seu descendente.

Este é o resultado:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

A consulta de exemplo a seguir no banco de dados AdventureWorks recupera todos os nós de elemento descendente do elemento <Features> filho do elemento <ProductDescription>:

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features/descendant::*  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

C. Especificando um eixo pai

A consulta a seguir retorna o filho do elemento <Summary> do elemento <ProductDescription> no documento XML do catálogo de produtos armazenado na tabela Production.ProductModel.

Este exemplo usa o eixo pai para retornar ao pai do elemento <Feature> e recuperar o elemento <Summary> filho do elemento <ProductDescription>.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary  
')  
FROM   Production.ProductModel  
WHERE  ProductModelID=19  
  

Neste exemplo de consulta, a expressão de caminho usa o eixo parent. Você pode reescrever a expressão sem o eixo pai, conforme mostrado a seguir:

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

Um exemplo mais útil do eixo pai é fornecido no exemplo a seguir.

Cada descrição do catálogo de modelo de produto armazenada na coluna CatalogDescription da tabela ProductModel tem um elemento <ProductDescription> que tem o atributo ProductModelID e <Features> elemento filho, conforme mostrado no fragmento a seguir:

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

A consulta define uma variável iteradora, $f, na instrução FLWOR para retornar os filhos do elemento <Features>. Para obter mais informações, consulte FLWOR Statement and Iteration (XQuery). Para cada recurso, a cláusula return constrói um XML no seguinte formato:

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

Para adicionar o ProductModelID para cada elemento <Feature>, o eixo parent é especificado:

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*  
  return  
   <Feature  
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >  
          { $f }  
   </Feature>  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

Este é o resultado parcial:

<Feature ProductModelID="19">  
  <wm:Warranty   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>  
    <wm:Description>parts and labor</wm:Description>  
  </wm:Warranty>  
</Feature>  
<Feature ProductModelID="19">  
  <wm:Maintenance   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:NoOfYears>10 years</wm:NoOfYears>  
    <wm:Description>maintenance contract available through your dealer   
                  or any AdventureWorks retail store.</wm:Description>  
  </wm:Maintenance>  
</Feature>  
<Feature ProductModelID="19">  
  <p1:wheel   
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">  
      High performance wheels.  
  </p1:wheel>  
</Feature>  

Observe que a [1] de predicados na expressão de caminho é adicionada para garantir que um valor singleton seja retornado.