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 示例,这些实例存储在 AdventureWorks 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅AdventureWorks 数据库中的 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。