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 ではなく、空のシーケンスが返されます。