基于节点的函数 - 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 函数,主要是为了具有向后兼容性才包括在内。

  • LotSizeBXQuery 指定数字函数,并且是冗余的。

  • LotSizeD查询说明了在算术运算中使用数字值。

结果如下:

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

实现限制

限制如下:

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

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

另请参阅

针对 xml 数据类型的 XQuery 函数