Expressões de Caminho – Especificar Eixo
Aplica-se: 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 do XQuery no SQL Server dá suporte às seguintes etapas de eixo:
Eixo | Descrição |
---|---|
child | Retorna os filhos do nó de contexto. |
descendant | Retorna todos os descendentes do nó de contexto. |
parent | Retorna o pai do nó de contexto. |
attribute | Retorna os atributos do nó de contexto. |
self | Retorna o próprio nó de contexto. |
descendant-or-self | 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 reverso, pois ele pesquisa para trás na hierarquia do documento. Por exemplo, a expressão do caminho relativo child::ProductDescription/child::Summary
tem duas etapas, e cada etapa especifica um eixo child
. A primeira etapa recupera os filhos do <elemento ProductDescription> do nó de contexto. Para cada <nó do elemento ProductDescription> , a segunda etapa recupera os filhos do <nó do elemento Summary> .
A expressão de caminho relativo, child::root/child::Location/attribute::LocationID
, tem três etapas. As primeiras duas etapas especificam 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 LocationID
atributo do filho do nó do <elemento Location> do <elemento raiz>.
Exemplos
Os exemplos de consulta neste tópico são especificados em relação a colunas de tipo xml no banco de dados AdventureWorks.
R. Especificando um eixo filho
Para um modelo de produto específico, a consulta a seguir recupera os <filhos do nó do elemento Features> do <nó do elemento ProductDescription> da descrição do catálogo de produtos armazenada Production.ProductModel
na tabela.
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 na consulta anterior:
O
query()
método 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 de nó,ProductDescription
eFeatures
. Para obter informações sobre testes de nó, consulte Especificando o teste de nó em uma etapa de expressão de caminho.
B. Especificando eixos descendentes e descendentes ou independentes
O exemplo a seguir usa os eixos descendente e descendente ou self. A consulta neste exemplo é especificada em relação a uma variável de tipo 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á solicitando todos os descendentes do nó do <b
> elemento.
O asterisco (*) no teste de nó representa o nome do nó como um teste de nó. Dessa forma, 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. Não são retornados nós de texto. Para obter mais informações sobre o tipo de nó primário e sua relação com o teste de nó, consulte o tópico Especificando o teste de nó em uma etapa de expressão de caminho.
Os nós <c
> de elemento 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 descendentes doFeatures
<> filho do <ProductDescription
> elemento:
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 <Summary
> filho do elemento no documento XML do> <ProductDescription
catálogo de produtos armazenado na Production.ProductModel
tabela.
Este exemplo usa o eixo pai para retornar ao pai do <>Feature
elemento e recuperar oSummary
> <filho do <ProductDescription
> elemento.
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, como 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 de catálogo de modelo de produto armazenada na coluna CatalogDescription da tabela ProductModel tem um <ProductDescription>
elemento que tem o atributo e <Features>
o ProductModelID
elemento filho, conforme mostrado no fragmento a seguir:
<ProductDescription ProductModelID="..." >
...
<Features>
<Feature1>...</Feature1>
<Feature2>...</Feature2>
...
</ProductDescription>
A consulta define uma variável iterator, $f
, na instrução FLWOR para retornar os filhos do elemento do elemento <Features>
. Para obter mais informações, consulte Instrução e iteração FLWOR (XQuery). Para cada recurso, a cláusula return
constrói um XML na seguinte forma:
<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>
Para adicionar o ProductModelID
para cada <Feature
> elemento, o parent
eixo é 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 o predicado [1]
na expressão de caminho é adicionado para assegurar que um valor de singleton seja retornado.