Fonctions relatives au contexte : position (XQuery)
S’applique à :SQL Server
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é que dans le contexte d’un prédicat dépendant du contexte. 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 fournit des exemples XQuery sur des instances XML stockées dans différentes colonnes de type xml dans la AdventureWorks2022
base de données.
R. 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 fonctionnalités, les deux premiers éléments enfants de l’élément, à partir de la <Features
> description du catalogue de modèles de produits. S’il existe d’autres fonctionnalités, il ajoute un <there-is-more/
> élément 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 dans la requête précédente :
L’espace de noms mot clé dans le prolog XQuery définit un préfixe d’espace de noms qui est utilisé dans le corps de la requête.
Le corps de la requête construit du code XML qui a un <élément Product> avec des attributs ProductModelID et ProductModelName , et dont les fonctionnalités de produit sont retournées en tant qu’é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 fonctionnalités 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 AdventureWorks retail store.</p2:Description>
</p2:Maintenance>
<there-is-more/>
</Product>
...