Compartir a través de


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>   
...  

Consulte también

Funciones de XQuery con el tipo de datos xml