Casos gerais de uso de XQuery

Aplica-se a:SQL Server

Este tópico fornece exemplos gerais de uso de XQuery.

Exemplos

a. Consultar descrições de catálogo para localizar produtos e pesos

A consulta a seguir retorna as IDs e os pesos de modelo do produto , se existentes, da descrição do catálogo de produtos. A consulta constrói XML que tenha a seguinte forma:

<Product ProductModelID="...">  
  <Weight>...</Weight>  
</Product>  

Esta é a consulta:

SELECT CatalogDescription.query('  
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  <Product  ProductModelID="{ (/p1:ProductDescription/@ProductModelID)[1] }">  
     {   
       /p1:ProductDescription/p1:Specifications/Weight   
     }   
  </Product>  
') as Result  
FROM Production.ProductModel  
WHERE CatalogDescription is not null  

Observe o seguinte na consulta anterior:

  • A palavra-chave namespace no prolog XQuery define um prefixo de namespace usado no corpo da consulta.

  • O corpo da consulta constrói o XML exigido.

  • Na cláusula WHERE, o método exist() é usado para localizar apenas linhas que contêm descrições do catálogo de produtos. Ou seja, o XML que contém o <ProductDescription> elemento .

Este é o resultado:

<Product ProductModelID="19"/>  
<Product ProductModelID="23"/>   
<Product ProductModelID="25"/>   
<Product ProductModelID="28"><Weight>Varies with size.</Weight></Product>  
<Product ProductModelID="34"/>  
<Product ProductModelID="35"/>  

A consulta a seguir recupera as mesmas informações, mas somente para os modelos de produto cuja descrição do catálogo inclui o peso, o <Weight> elemento, nas especificações, o <Specifications> elemento . Este exemplo usa WITH XMLNAMESPACES para declarar o prefixo pd e sua associação de namespace. Dessa forma, a associação não é descrita no método query() e no método exist().

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
SELECT CatalogDescription.query('  
          <Product  ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">  
                 {   
                      /pd:ProductDescription/pd:Specifications/Weight   
                 }   
          </Product>  
') as x  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Specifications//Weight ') = 1  

Na consulta anterior, o método exist() do tipo de dados xml na cláusula WHERE verifica se há um <Weight> elemento no <Specifications> elemento .

B. Localizar IDs de modelos de produtos cujas descrições de catálogo incluem ângulo frontal e pequenas fotos

A descrição do catálogo de produtos XML inclui as imagens do produto, o <Picture> elemento . Cada foto tem várias propriedades. Eles incluem o ângulo da imagem, o <Angle> elemento e o tamanho, o <Size> elemento .

Para modelos de produtos cujas descrições de catálogo incluem ângulo frontal e pequenas fotos, a consulta constrói um XML com o seguinte formato:

< Product ProductModelID="...">  
  <Picture>  
    <Angle>front</Angle>  
    <Size>small</Size>  
  </Picture>  
</Product>  
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
SELECT CatalogDescription.query('  
   <pd:Product  ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">  
      <Picture>  
         {  /pd:ProductDescription/pd:Picture/pd:Angle }   
         {  /pd:ProductDescription/pd:Picture/pd:Size }   
      </Picture>  
   </pd:Product>  
') as Result  
FROM  Production.ProductModel  
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Picture') = 1  
AND   CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Angle)[1]', 'varchar(20)')  = 'front'  
AND   CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Size)[1]', 'varchar(20)')  = 'small'  

Observe o seguinte na consulta anterior:

  • Na cláusula WHERE, o método exist() é usado para recuperar apenas linhas que têm descrições do catálogo de produtos com o <Picture> elemento .

  • A cláusula WHERE usa o método value() duas vezes para comparar os valores dos <Size> elementos e .<Angle>

Este é um resultado parcial:

<p1:Product   
  xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"   
  ProductModelID="19">  
  <Picture>  
    <p1:Angle>front</p1:Angle>  
    <p1:Size>small</p1:Size>  
  </Picture>  
</p1:Product>  
...  

C. Crie uma lista simples do nome do modelo de produto e dos pares de recursos, com cada par entre os <elementos Features>

Na descrição de catálogo de modelo de produto, o XML inclui várias características de produto. Todos esses recursos estão incluídos no <Features> elemento . A consulta usa XQuery (Construção XML) para construir o XML necessário. A expressão nas chaves é substituída pelo resultado.

SELECT CatalogDescription.query('  
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  for $pd in /p1:ProductDescription,  
   $f in $pd/p1:Features/*  
  return  
   <Feature>  
     <ProductModelName> { data($pd/@ProductModelName) } </ProductModelName>  
     { $f }  
  </Feature>          
') as x  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Observe o seguinte na consulta anterior:

  • $pd/p1:Features/* retorna apenas os filhos do nó de elemento de <Features>, mas $pd/p1:Features/node() retorna todos os nós. Isso inclui os nós de elemento, nós de texto, as instruções de processamento e os comentários.

  • Os dois loops FOR geram um produto Cartesiano do qual o nome de produto e a característica individual são retornados.

  • O ProductName é um atributo. A construção XML nesta consulta retorna-o como um elemento.

Este é um resultado parcial:

<Feature>  
 <ProductModelName>Mountain 100</ProductModelName>  
 <ProductModelID>19</ProductModelID>  
 <p1:Warranty   
   xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>  
    <p1:Description>parts and labor</p1:Description>  
 </p1:Warranty>  
</Feature>  
<Feature>  
 <ProductModelName>Mountain 100</ProductModelName>  
 <ProductModelID>19</ProductModelID>  
 <p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <p2:NoOfYears>10</p2:NoOfYears>  
    <p2:Description>maintenance contact available through your dealer   
           or any AdventureWorks retail store.</p2:Description>  
    </p2:Maintenance>  
</Feature>  
...  
...      

D. Na descrição do catálogo de um modelo de produto, liste o nome do modelo de produto, a ID do modelo e os recursos agrupados dentro de um <elemento Product>

Usando as informações armazenadas na descrição do catálogo do modelo de produto, a consulta a seguir lista o nome do modelo de produto, a ID do modelo e os recursos agrupados dentro de um <elemento Product> .

SELECT ProductModelID, CatalogDescription.query('  
     declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     <Product>  
         <ProductModelName>   
           { data(/pd:ProductDescription/@ProductModelName) }   
         </ProductModelName>  
         <ProductModelID>   
           { data(/pd:ProductDescription/@ProductModelID) }   
         </ProductModelID>  
         { /pd:ProductDescription/pd:Features/* }  
     </Product>          
') as x  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Este é um resultado parcial:

<Product>  
  <ProductModelName>Mountain 100</ProductModelName>  
  <ProductModelID>19</ProductModelID>  
  <p1:Warranty>... </p1:Warranty>  
  <p2:Maintenance>...  </p2:Maintenance>  
  <p3:wheel xmlns:p3="https://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p3:wheel>  
  <p4:saddle xmlns:p4="https://www.adventure-works.com/schemas/OtherFeatures">  
    <p5:i xmlns:p5="http://www.w3.org/1999/xhtml">Anatomic design</p5:i> and made from durable leather for a full-day of riding in comfort.</p4:saddle>  
  <p6:pedal xmlns:p6="https://www.adventure-works.com/schemas/OtherFeatures">  
    <p7:b xmlns:p7="http://www.w3.org/1999/xhtml">Top-of-the-line</p7:b> clipless pedals with adjustable tension.</p6:pedal>  
   ...  

E. Recuperar as descrições de recursos de modelos do produto

A consulta a seguir constrói XML que inclui um <Product> elemento que tem atributos ProducModelID, ProductModelName e os dois primeiros recursos do produto. Especificamente, os dois primeiros recursos do produto são os dois primeiros elementos filho do <Features> elemento. Se houver mais recursos, ele retornará um elemento vazio <There-is-more/> .

SELECT CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     <Product>   
          { /pd:ProductDescription/@ProductModelID }  
          { /pd:ProductDescription/@ProductModelName }   
          {  
            for $f in /pd:ProductDescription/pd:Features/*[position()<=2]  
            return  
            $f   
          }  
          {  
            if (count(/pd:ProductDescription/pd:Features/*) > 2)  
            then <there-is-more/>  
            else ()  
          }   
     </Product>          
') as Result  
FROM Production.ProductModel  
WHERE CatalogDescription is not NULL  

Observe o seguinte na consulta anterior:

  • O FOR... A estrutura de loop RETURN recupera os dois primeiros recursos do produto. A função position() é usada para localizar a posição dos elementos na sequência.

F. Localizar nomes de elementos na descrição do catálogo de produtos que terminam com "ons"

A consulta a seguir pesquisa as descrições do catálogo e retorna todos os elementos no <ProductDescription> elemento cujo nome termina com "ons".

SELECT ProductModelID, CatalogDescription.query('  
     declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      for $pd in /p1:ProductDescription/*[substring(local-name(.),string-length(local-name(.))-2,3)="ons"]  
      return   
          <Root>  
             { $pd }  
          </Root>  
') as Result  
FROM Production.ProductModel  
WHERE CatalogDescription is not NULL  

Este é um resultado parcial:

ProductModelID   Result  
-----------------------------------------  
         19        <Root>         
                     <p1:Specifications xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">          
                          ...         
                     </p1:Specifications>         
                   </Root>          

G. Localizar descrições resumidas que contêm a palavra "Aerodynamic"

A consulta a seguir recupera modelos de produto cujas descrições de catálogo contêm a palavra "Aerodinâmico" na descrição sumária:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
SELECT ProductModelID, CatalogDescription.query('  
          <Prod >  
             { /pd:ProductDescription/@ProductModelID }  
             { /pd:ProductDescription/pd:Summary }  
          </Prod>  
 ') as Result  
FROM Production.ProductModel  
WHERE CatalogDescription.value('  
     contains( string( (/pd:ProductDescription/pd:Summary)[1] ),"Aerodynamic")','bit') = 1  

Observe que a consulta SELECT especifica os métodos query() e value() do tipo de dados xml . Portanto, em vez de repetir a declaração namespaces duas vezes em dois prólogos de consulta diferentes, o prefixo pd será usado na consulta e será definido apenas uma vez usando WITH XMLNAMESPACES.

Observe o seguinte na consulta anterior:

  • A cláusula WHERE é usada para recuperar apenas as linhas em que a descrição do catálogo contém a palavra "Aerodynamic" no <Summary> elemento .

  • A função contains() é usada para ver se a palavra está incluída no texto.

  • O método value() do tipo de dados xml compara o valor retornado por contains() a 1.

Este é o resultado:

ProductModelID Result        
-------------- ------------------------------------------  
28     <Prod ProductModelID="28">  
        <pd:Summary xmlns:pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
       <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
         A TRUE multi-sport bike that offers streamlined riding and a  
         revolutionary design. Aerodynamic design lets you ride with the   
         pros, and the gearing will conquer hilly roads.</p1:p>  
       </pd:Summary>  
      </Prod>    

H. Localizar modelos de produtos cujas descrições de catálogo não incluem fotos do modelo do produto

A consulta a seguir recupera ProductModelIDs para modelos de produto cujas descrições de catálogo não incluem um <Picture> elemento .

SELECT  ProductModelID  
FROM    Production.ProductModel  
WHERE   CatalogDescription is not NULL  
AND     CatalogDescription.exist('declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /p1:ProductDescription/p1:Picture  
') = 0  

Observe o seguinte na consulta anterior:

  • Se o método exist() na cláusula WHERE retornar False (0), a ID do modelo de produto será retornada. Caso contrário, não é retornado.

  • Como todas as descrições do produto incluem um <Picture> elemento, o conjunto de resultados está vazio nesse caso.

Consulte Também

XQueries que envolvem hierarquias
XQueries que envolvem ordem
XQueries que manipulam dados relacionais
Pesquisa de cadeia de caracteres em XQuery
Manipulando namespaces em XQuery
Adicionar namespaces a consultas com WITH XMLNAMESPACES
Dados XML (SQL Server)
Referência de linguagem Xquery (SQL Server)