Fonction position (XQuery)
Renvoie une valeur entière indiquant la position de l'élément contextuel dans la séquence d'éléments en cours de traitement.
Syntaxe
fn:position() as xs:integer
Notes
Dans SQL Server, fn:position() ne peut être utilisée que dans le contexte d'un prédicat s'appuyant sur un contexte défini. Plus précisément, elle ne peut être utilisée qu'entre crochets ([ ]).Toute comparaison à cette fonction ne réduit pas la cardinalité lors de l'inférence de type statique.
Exemples
Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockés dans différentes colonnes de type xml tirées de la base de données AdventureWorks2008R2. Pour obtenir une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.
A. Utilisation de la fonction XQuery position() pour récupérer les deux premières caractéristiques de produits
La requête suivante récupère les deux premières caractéristiques de produits, correspondant aux deux premiers éléments enfants de l'élément <Features>, tirées de la description du catalogue retraçant les modèles de produits. Si d'autres caractéristiques sont présentes, elle ajoute un élément <there-is-more/> (« Et plus encore ») au résultat.
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;
Notez les points suivants par rapport à la requête précédente :
Le mot clé namespace mentionné dans le prologue de la requête XQuery définit un préfixe d'espace de noms utilisé dans le corps de la requête.
Le corps de la requête construit du code XML incluant un élément <Product> possédant les attributs ProductModelID et ProductModelName, et dont les caractéristiques des produits sont renvoyés sous forme d'éléments enfants.
La fonction position() est utilisée dans le prédicat pour déterminer la position de l'élément enfant <Features> dans le contexte. Si l'élément correspond à la première ou à la deuxième caractéristique, il est renvoyé dans les résultats.
L'instruction IF ajoute un élément <there-is-more/> au résultat s'il existe plus de deux caractéristiques présentes dans le catalogue de produits.
Puisque les modèles de produits n'ont pas tous leur description de catalogue stockée dans la table, la clause WHERE permet de passer outre les lignes où CatalogDescriptions correspond à NULL.
Voici un extrait du résultat :
<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 Adventure Works retail store.</p2:Description>
</p2:Maintenance>
<there-is-more/>
</Product>
…