number (función de XQuery)

Devuelve el valor numérico del nodo indicado por $arg.

Sintaxis

fn:number() as xs:double? 
fn:number($arg as node()?) as xs:double?

Argumentos

  • $arg
    Nodo cuyo valor se devolverá como un número.

Notas

Si no se especifica $arg, se devolverá el valor numérico del nodo de contexto convertido en un valor doble. En SQL Server, fn:number() sin un argumento sólo se puede utilizar en el contexto de un predicado dependiente del contexto. En concreto, sólo se puede utilizar entre corchetes ([ ]). Por ejemplo, la expresión siguiente devuelve el elemento <ROOT>.

declare @x xml
set @x='<ROOT>111</ROOT>'
select @x.query('/ROOT[number()=111]')

Si el valor del nodo no es una representación léxica válida de un tipo simple numérico, tal como se define en XML Schema Part 2:Datatypes, W3C Recommendation, la función devolverá una secuencia vacía. No se admiten los valores NaN.

Ejemplos

En este tema se ofrecen ejemplos de consultas 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 number() para recuperar el valor numérico de un atributo

La consulta siguiente recupera el valor numérico del atributo de tamaño de lote de la primera ubicación de centro de trabajo del proceso de fabricación del modelo de producto 7.

SELECT ProductModelID, Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
     for $i in (//AWMI:root//AWMI:Location)[1]
     return 
       <Location LocationID="{ ($i/@LocationID) }" 
                   LotSizeA="{  $i/@LotSize }"
                   LotSizeB="{  number($i/@LotSize) }"
                   LotSizeC="{ number($i/@LotSize) + 1 }" >
                   
       </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7

Observe lo siguiente en la consulta anterior:

  • La función number() no es obligatoria, tal como se muestra en la consulta del atributo LotSizeA. Se trata de una función de XPath 1.0 incluida sobre todo para mantener la compatibilidad con versiones anteriores.

  • La consulta XQuery de LotSizeB especifica la función de número y es redundante.

  • La consulta de LotSizeD ilustra la utilización de un valor de número en una operación aritmética.

El resultado es el siguiente:

ProductModelID   Result
----------------------------------------------
7              <Location LocationID="10" 
                         LotSizeA="100" 
                         LotSizeB="100" 
                         LotSizeC="101" />

Limitaciones de la implementación

Éstas son las limitaciones:

  • La función number() sólo acepta nodos. No acepta valores atómicos.

  • Cuando no se pueden devolver valores como un número, la función number() devuelve le secuencia vacía en lugar de NaN.