Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
namespacepalavra-chave no prolog XQuery define um prefixo de namespace usado no corpo da consulta.O corpo da consulta constrói o XML exigido.
WHERENa cláusula, oexist()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:
WHERENa cláusula, oexist()método é usado para recuperar apenas linhas que têm descrições do catálogo de produtos com o<Picture>elemento.A
WHEREcláusula usa ovalue()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
FORloops 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
FORestrutura de loop ...RETURNrecupera os dois primeiros recursos do produto. Aposition()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
WHEREclá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 porcontains()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 naWHEREclá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.
Conteúdo relacionado
- 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 usando WITH XMLNAMESPACES
- Dados XML (SQL Server)
- Referência de linguagem Xquery (SQL Server)