Funzioni di contesto - position (XQuery)
Si applica a: SQL Server
Restituisce un valore integer che indica la posizione dell'elemento di contesto all'interno della sequenza di elementi corrente da elaborare.
Sintassi
fn:position() as xs:integer
Osservazioni:
In SQL Server fn:position() può essere usato solo nel contesto di un predicato dipendente dal contesto. In particolare, può essere utilizzata solo tra parentesi ([ ]). I confronti basati su tale funzione non riducono la cardinalità durante l'interferenza dei tipi statici.
Esempi
In questo argomento vengono forniti esempi di XQuery su istanze XML archiviate in varie colonne di tipo xml nel AdventureWorks2022
database.
R. Utilizzo della funzione XQuery position() per recuperare le prime due caratteristiche del prodotto
La query seguente recupera le prime due funzionalità, i primi due elementi figlio dell'elemento <Features
> , dalla descrizione del catalogo del modello di prodotto. Se sono presenti più funzionalità, aggiunge un <there-is-more/
> elemento al risultato.
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 x
FROM Production.ProductModel
WHERE CatalogDescription is not null
Dalla query precedente si noti quanto segue:
La parola chiave dello spazio dei nomi nel prologo XQuery definisce un prefisso dello spazio dei nomi usato nel corpo della query.
Il corpo della query costruisce xml con un <elemento Product> con attributi ProductModelID e ProductModelName e ha funzionalità del prodotto restituite come elementi figlio.
La funzione position() viene usata nel predicato per determinare la posizione dell'elemento <figlio Features> nel contesto. Viene restituita se si tratta della prima o della seconda caratteristica.
L'istruzione IF aggiunge un <elemento there-more/> al risultato se sono presenti più di due funzionalità nel catalogo prodotti.
Poiché non tutte le descrizioni del catalogo dei modelli di prodotto vengono archiviate nella tabella, viene utilizzata la clausola WHERE per scartare le righe in cui CatalogDescriptions è NULL.
Risultato parziale:
<Product ProductModelID="19" ProductModelName="Mountain 100">
<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>
<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>
<there-is-more/>
</Product>
...