基于节点的函数 - number
适用范围:SQL Server
返回由$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 架构第 2 部分:数据类型,W3C 建议中定义,函数将返回空序列。 不支持 NaN。
示例
本主题针对 AdventureWorks 数据库中各种 xml 类型列中存储的 XML 实例提供 XQuery 示例。
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 指定数字函数,并且是冗余的。
LotSizeD 的查询说明了在算术运算中使用数字值。
结果如下:
ProductModelID Result
----------------------------------------------
7 <Location LocationID="10"
LotSizeA="100"
LotSizeB="100"
LotSizeC="101" />
实现限制
限制如下:
number() 函数仅接受节点。 它不接受原子值。
当值不能作为数字返回时, number() 函数将返回空序列而不是 NaN。