number 函数 (XQuery)

返回由 $arg 指明的节点的数值。

语法

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

参数

  • $arg
    将以数字返回其值的节点。

注释

如果未指定 $arg,则返回上下文节点的数值(转换为双精度值)。在 SQL Server 中,没有参数的 fn:number() 只能用于与上下文相关的谓词的上下文中。特别要指出的是,它只能在方括号 ([ ]) 内使用。例如,下面的表达式返回 <ROOT> 元素。

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

如果节点的值不是数值简单类型的有效词法表示形式(如 XML Schema Part 2:Datatypes, W3C Recommendation 中定义),则函数返回空序列。不支持 NaN。

示例

本主题提供了一些对 XML 实例的 XQuery 示例,这些实例存储在 AdventureWorks2008R2 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅AdventureWorks2008R2 数据库中的 xml 数据类型表示形式

A. 使用 number() XQuery 函数检索属性的数值

下面的查询从产品型号 7 的生产进程的第一个生产车间检索 lot size 属性的数值。

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;

请注意上述查询的以下方面:

  • 不需要 number() 函数,如对 LotSizeA 属性的查询所示。这是一个 XPath 1.0 函数,主要是为了具有向后兼容性才包括在内。

  • LotSizeB 的 XQuery 指定 number 函数,它是多余的。

  • LotSizeD 的查询说明算术运算中数值的用法。

结果如下:

ProductModelID Result

----------------------------------------------

7 <Location LocationID="10"

LotSizeA="100"

LotSizeB="100"

LotSizeC="101" />

实现限制

限制如下:

  • number() 函数只接受节点。它不接受原子值。

  • 当值无法作为数字返回时,number() 函数返回空序列而不是 NaN。