Compartilhar via


Casos gerais de uso do XQuery

Aplica-se:SQL Server

Este artigo fornece exemplos gerais de uso do XQuery.

Exemplos

R. 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 as seguintes considerações da consulta anterior:

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

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

  • WHERE Na cláusula, o exist() método é 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.

Eis 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 esses 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 pd prefixo e sua associação de namespace. Dessa forma, a associação não é descrita no query() método e no exist() método.

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 exist() método do tipo de dados xml na WHERE cláusula 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 imagem tem várias propriedades, incluindo 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 as seguintes considerações da consulta anterior:

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

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

Aqui está 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 do produto e dos pares de recursos, com cada par entre os <recursos elemento Recursos>

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 a construção XML (XQuery) 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 as seguintes considerações da consulta anterior:

  • $pd/p1:Features/* retorna apenas os filhos do nó de elemento, <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 FOR loops geram um produto Cartesiano do qual o nome do produto e o recurso individual são retornados.

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

Aqui está 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 do 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 <Product> elemento.

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;

Aqui está 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 ProductModelID, ProductModelName atributos 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 as seguintes considerações da consulta anterior:

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

F. Localizar nomes de elementos da descrição do catálogo de produtos que termina 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;

Aqui está 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;

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

Observe as seguintes considerações da consulta anterior:

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

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

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

Eis 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 produto cujas descrições de catálogo não incluem imagens de modelo de 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 as seguintes considerações da consulta anterior:

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

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