Casos gerais de uso de XQuery
Aplica-se: SQL Server
Este tópico fornece exemplos gerais de uso de 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 o seguinte na consulta anterior:
A palavra-chave namespace no prólogo XQuery define um prefixo de namespace que é 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 de 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á umWeight
<> 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. Isso inclui 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 de 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 and.<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 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 XML Construction (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 o seguinte na consulta anterior:
$pd/p1:Features/* retorna apenas os filhos do nó do 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 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 <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 encontrar 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 "Aerodinâmica" 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() com 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 do produto será retornada. Caso contrário, não é retornado.
Como todas as descrições de produto incluem um <
Picture
> elemento, o conjunto de resultados está vazio nesse caso.
Confira 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)