Funzione position (XQuery)
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, la funzione fn:position() può essere utilizzata solo nell'ambito 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 utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml nel database AdventureWorks. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks.
A. Utilizzo della funzione XQuery position() per recuperare le prime due funzionalità del prodotto
La query seguente recupera le prime due funzionalità, ovvero i primi due elementi figlio dell'elemento <Features>, dalla descrizione del catalogo prodotti. Se sono disponibili più funzionalità, viene aggiunto un elemento <there-is-more/> 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 namespace nel prologo XQuery definisce un prefisso dello spazio dei nomi nel corpo della query.
Il corpo della query costruisce un'istanza XML che include un elemento <Product> con gli attributi ProductModelID e ProductModelName, nonché le funzionalità del prodotto restituite come elementi figlio.
La funzione position() viene utilizzata nel predicato per determinare la posizione dell'elemento figlio <Features> nel contesto. Viene restituita se si tratta della prima o della seconda funzionalità.
Se il catalogo prodotti contiene più di due funzionalità, l'istruzione IF aggiunge un elemento <there-is-more/> al risultato.
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>
…