position (función de XQuery)
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
Notas
En SQL Server, fn:position() sólo se puede utilizar en el contexto de un predicado dependiente del contexto. Concretamente, sólo 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 ofrecen ejemplos de XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos AdventureWorks. Para obtener información general de cada una de estas columnas, consulte Representación de tipo de datos xml en la base de datos AdventureWorks.
A. Usar la función de XQuery position() para recuperar las dos primeras características de producto
La consulta siguiente recupera las dos primeras características, es decir, los dos primeros elementos secundarios del elemento <Features>, a partir de la descripción del catálogo de modelos de productos. Si hay más características, se incorporará un elemento <there-is-more/> 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 namespace del prólogo de las consultas XQuery define un prefijo de espacio de nombres que se utiliza en el cuerpo de la consulta.
El cuerpo de la consulta crea XML que tiene un elemento <Product> con los atributos ProductModelID y ProductModelName, e incluye características de producto que se devuelven en forma de elementos secundarios.
La función position() se utiliza 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 incorpora 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>
…