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

Comentarios

En SQL Server, fn:position() solo se puede utilizar 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 ofrecen ejemplos de XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos AdventureWorks2008R2. Para obtener información general de cada una de estas columnas, vea Representación de tipo de datos xml en la base de datos AdventureWorks2008R2.

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.

Este 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 Adventure Works retail store.</p2:Description>

</p2:Maintenance>

<there-is-more/>

</Product>