number 関数 (XQuery)

$arg で示されるノードの数値を返します。

構文

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

引数

  • $arg
    数値として値が返されるノード。

説明

$arg を指定しないと、double 型に変換されたコンテキスト ノードの数値が返されます。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 勧告)」で定義されているように、ノードの値が単純型の数値として有効な字句表現ではない場合、空のシーケンスが返されます。NaN はサポートされません。

このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納されている XML インスタンスに対して実行する XQuery の例を紹介します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。

A. number() XQuery 関数を使用して属性の数値を取得する

次のクエリでは、製造モデル 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

上のクエリに関して、次の点に注意してください。

  • LotSizeA 属性のクエリで示すように、number() 関数は必須ではありません。これは XPath 1.0 関数で、主に旧バージョンとの互換性上の理由で含まれています。

  • LotSizeB の XQuery では、number 関数が指定されており、冗長です。

  • LotSizeC のクエリは、算術演算での数値の使用について示しています。

結果を次に示します。

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

実装の制限事項

制限事項を次に示します。

  • number() 関数は、ノードのみを受け取ることができます。アトミック値を受け取ることはできません。

  • number() 関数が値を数値で返すことができないときは、NaN ではなく、空のシーケンスが返されます。