ノードの関数 - number
適用対象:SQL Server
$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 スキーマ パート 2:Datatypes、W3C Recommendation で定義されているように、ノードの値が数値単純型の有効な字句表現でない場合、関数は空のシーケンスを返します。 NaN はサポートされません。
例
このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納されている XML インスタンスに対する XQuery の例を示します。
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 関数を指定し、冗長です。
LotSizeD のクエリは、算術演算での数値の使用を示しています。
結果を次に示します。
ProductModelID Result
----------------------------------------------
7 <Location LocationID="10"
LotSizeA="100"
LotSizeB="100"
LotSizeC="101" />
実装の制限事項
制限事項は次のとおりです。
number() 関数はノードのみを受け入れます。 アトミック値を受け取ることはできません。
数値として値を返すことができない場合、 number() 関数は NaN ではなく空のシーケンスを返します。