Definizione dell'asse in un passo dell'espressione di percorso
Ogni passe dell'asso in un'espressione di percorso include i componenti seguenti:
Un asse
Un test di nodo
Per ulteriori informazioni, vedere Espressioni di percorso (XQuery).
L'implementazione di XQuery in SQL Server supporta i passi dell'asse seguenti:
Asse |
Descrizione |
---|---|
child |
Restituisce gli elementi figlio del nodo di contesto. |
descendant |
Restituisce tutti i discendenti del nodo di contesto. |
parent |
Restituisce l'elemento padre del nodo di contesto. |
attribute |
Restituisce gli attributi del nodo di contesto. |
self |
Restituisce il nodo di contesto stesso. |
descendant-or-self |
Restituisce il nodo di contesto e tutti i relativi discendenti. |
Tutti questi assi, ad eccezione dell'asse parent, sono assi per la ricerca in avanti. L'asse parent è un asse per la ricerca a ritroso, in quanto esegue la ricerca all'indietro nella gerarchia del documento. Ad esempio, l'espressione di percorso relativo child::ProductDescription/child::Summary include due passi, ognuno dei quali specifica un asse child. Il primo passo recupera gli elementi figlio <ProductDescription> del nodo di contesto. Per ogni nodo elemento <ProductDescription>, il secondo passo recupera gli elementi figlio <Summary> corrispondenti.
L'espressione di percorso relativo child::root/child::Location/attribute::LocationID include tre passi. I primi due passi specificano ognuno un asse child, mentre il terzo passo specifica l'asse attribute. Se viene eseguita sui documenti XML delle istruzioni di produzione nella tabella Production.ProductModel, l'espressione restituisce l'attributo LocationID del nodo elemento figlio <Location> dell'elemento <root>.
Esempi
Gli esempi di query indicati in questo argomento vengono eseguiti sulle colonne di tipo xml del database AdventureWorks2008R2. Per informazioni su tali colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.
A. Definizione di un asse child
Per il modello di un prodotto specifico, la query seguente recupera gli elementi figlio <Features> del nodo elemento <ProductDescription> dalla descrizione del catalogo prodotti archiviata nella tabella Production.ProductModel.
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
Dalla query precedente si noti quanto segue:
Il metodo query() con tipo di dati xml specifica l'espressione di percorso.
Entrambi i passi dell'espressione di percorso specificano un asse child e i nomi dei nodi, ProductDescription e Features, come test di nodo. Per informazioni sui test di nodo, vedere Definizione del test di nodo in un passo dell'espressione di percorso.
B. Definizione di assi descendant e descendant-or-self
Nell'esempio seguente vengono utilizzati assi descendant e descendant-or-self. La query illustrata nell'esempio viene eseguita su una variabile di tipo xml. L'istanza XML è semplificata per illustrare in modo chiaro la differenza nei risultati generati.
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
Nel risultato seguente, l'espressione restituisce il nodo elemento figlio <b> del nodo elemento <a>:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
Se in questa espressione si specifica un asse descendant per l'espressione di percorso,
/child::a/child::b/descendant::*, si richiedono tutti i discendenti del nodo elemento <b>.
L'asterisco (*) nel test di nodo rappresenta il nome del nodo come test di nodo. Pertanto, il tipo di nodo primario dell'asse descendant, il nodo elemento, determina i tipi di nodi restituiti. L'espressione restituisce quindi tutti i nodi elemento. I nodi di testo non vengono restituiti. Per ulteriori informazioni sul tipo di nodo primario e sulle relative relazioni con il test di nodo, vedere l'argomento Definizione del test di nodo in un passo dell'espressione di percorso.
I nodi elemento <c> e <d> vengono restituiti, come illustrato nel risultato seguente:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Se si specifica un asse descendant-or-self anziché l'asse descendant, /child::a/child::b/descendant-or-self::* restituisce il nodo di contesto, l'elemento <b> e i relativi discendenti.
Risultato:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
La query di esempio seguente sul database AdventureWorks2008R2 recupera tutti i nodi elemento discendenti dell'elemento figlio <Features> dell'elemento <ProductDescription>:
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. Definizione di un asse parent
La query seguente restituisce l'elemento figlio <Summary> dell'elemento <ProductDescription> nel documento XML del catalogo prodotti archiviato nella tabella Production.ProductModel.
In questo esempio viene utilizzato l'asse parent per tornare all'elemento padre dell'elemento <Feature> e recuperare l'elemento figlio <Summary> dell'elemento <ProductDescription>.
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
In questo esempio di query, l'espressione di percorso utilizza l'asse parent. È possibile riscrivere l'espressione senza l'asse parent, come illustrato di seguito:
/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary
Un esempio più dettagliato dell'asse parent è il seguente.
Ogni descrizione del catalogo prodotti archiviata nella colonna CatalogDescription della tabella ProductModel include un elemento <ProductDescription> con l'attributo ProductModelID e l'elemento figlio <Features>, come illustrato nel frammento seguente:
<ProductDescription ProductModelID="..." >
...
<Features>
<Feature1>...</Feature1>
<Feature2>...</Feature2>
...
</ProductDescription>
La query imposta la variabile iteratore $f nell'istruzione FLWOR per restituire gli elementi figli dell'elemento <Features>. Per ulteriori informazioni, vedere Istruzione e iterazione FLWOR (XQuery). Per ogni caratteristica, la clausola return costruisce un'istanza XML nel formato seguente:
<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>
Per aggiungere ProductModelID per ogni elemento <Feature>, viene specificato l'asse parent:
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
Risultato parziale:
<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 Adventure Works 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>
Si noti che il predicato [1] nell'espressione di percorso viene aggiunto per assicurare che venga restituito un valore singleton.