Funciones de contexto: position (XQuery)
Se aplica a:SQL Server
Esta función devuelve un valor entero que indica la posición del elemento de contexto dentro de la secuencia de elementos que se está procesando.
Sintaxis
fn:position() as xs:integer
Comentarios
En SQL Server, fn:position() solo se puede usar en el contexto de un predicado dependiente del contexto. Concretamente, solo se puede utilizar entre corchetes ([ ]). Las comparaciones con esta función no reducen la cardinalidad durante una inferencia de tipo estático.
Ejemplos
En este tema se proporcionan ejemplos de XQuery en instancias XML almacenadas en varias columnas de tipo xml de la AdventureWorks2022
base de datos.
A. Usar la función position() de XQuery para recuperar las dos primeras características de producto
La consulta siguiente recupera las dos primeras características, los dos primeros elementos secundarios del elemento, de la <Features
> descripción del catálogo del modelo de producto. Si hay más características, agrega un <there-is-more/
> elemento al resultado.
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
Observe lo siguiente en la consulta anterior:
La palabra clave de espacio de nombres de XQuery Prolog define un prefijo de espacio de nombres que se usa en el cuerpo de la consulta.
El cuerpo de la consulta construye XML que tiene un <elemento Product> con atributos ProductModelID y ProductModelName y tiene características de producto devueltas como elementos secundarios.
La función position() se usa en el predicado para determinar la posición del <elemento secundario Features> en contexto. Si es la primera o segunda característica, se devuelve.
La instrucción IF agrega un <elemento there-is-more/> al resultado si hay más de dos características en el catálogo de productos.
Dado que no todos los modelos de producto tienen sus descripciones de catálogo almacenadas en la tabla, la cláusula WHERE descarta las filas para las que CatalogDescriptions es NULL.
Éste es un resultado parcial:
<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>
...