型システム (XQuery)
適用対象:SQL Server
XQuery は、スキーマ型の厳密に型指定された言語であり、型指定されていないデータの場合は弱く型指定された言語です。 XQuery の定義済みの型には、次のものが含まれます。
名前空間内の XML スキーマ http://www.w3.org/2001/XMLSchema の組み込み型。
名前空間で定義されている http://www.w3.org/2004/07/xpath-datatypes 型。
このトピックでは、次についても説明します。
型指定された値とノードの文字列値。
式によって返されるシーケンス型に一致します。
XML スキーマの組み込み型
組み込みの種類の XML スキーマには、定義済みの名前空間プレフィックス xs があります。 これらの型の一部には 、xs:integer と xs:string が含まれます。 これらの組み込み型はすべてサポートされます。 これらの型は、XML スキーマ コレクションを作成するときに使用できます。
型指定された XML のクエリを実行するとき、ノードの静的および動的な型は、クエリの対象の列または変数に関連付けられた XML スキーマ コレクションによって決まります。 静的型と動的型の詳細については、「 式コンテキストとクエリ評価 (XQuery)」を参照してください。 たとえば、型指定された xml 列 (Instructions
) に対して次のクエリが指定されます。 式では、 を使用 instance of
して、返される属性の LotSize
型指定された値が xs:decimal
型であることを確認します。
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
この型指定情報は、 列に関連付けられている XML スキーマ コレクションによって提供されます。
XPath データ型名前空間で定義されている型
名前空間で定義されている http://www.w3.org/2004/07/xpath-datatypes 型には、 定義済みのプレフィックス xdt があります。 これらの型には、次のことが適用されます。
XML スキーマ コレクションを作成しているときは、これらの型を使用できません。 これらの型は XQuery 型システムで使用され、 XQuery および静的型指定に使用されます。 xdt 名前空間では、アトミック型 (例: xdt:untypedAtomic) にキャストできます。
型指定されていない XML に対してクエリを実行する場合、要素ノードの静的型と動的型は xdt:untyped であり、属性値の型は xdt:untypedAtomic です。 query() メソッドの結果では、型指定されていない XML が生成されます。 つまり、XML ノードはそれぞれ xdt:untyped と xdt:untypedAtomic として返されます。
xdt:dayTimeDuration 型と xdt:yearMonthDuration 型はサポートされていません。
次の例では、型指定されていない XML 変数に対してクエリが指定されています。 式 ( ) は、 data(/a[1]
1 つのアトミック値のシーケンスを返します。 関数は data()
、要素 <a>
の型指定された値を返します。 クエリ対象の XML は型指定されていないので、返される値は xdt:untypedAtomic
型です。 したがって、 instance of
は true を返します。
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
次の例の式 (/a[1]
) は、型指定された値を取得するのではなく、要素 <a>
という 1 つの要素のシーケンスを返します。 式は instance of
、要素テストを使用して、式によって返される値が の xdt:untyped type
要素ノードであることを確認します。
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
注意
型指定された XML インスタンスにクエリを実行して、クエリ式に parent 軸が含まれるときは、結果のノードの静的な型情報は使用できなくなります。 ただし、動的な型は引き続きノードに関連付けられています。
型指定された値と文字列値
すべてのノードには、型指定された値と文字列値があります。 型指定された XML データの場合、型指定された値の型は、クエリ対象の列または変数に関連付けられている XML スキーマ コレクションによって提供されます。 型指定されていない XML データの場合、型指定された値の型は xdt:untypedAtomic です。
data() または string() 関数を使用して、ノードの値を取得できます。
データ関数 (XQuery) は、ノードの型指定された値を返します。
文字列関数 (XQuery) は、ノードの文字列値を返します。
次の XML スキーマ コレクションでは、 <root
> 整数型の 要素が定義されています。
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
次の例の式では、最初に /root[1]
の型指定された値を取得してから、その値に 3
を加算しています。
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
次の例では、式の string(/root[1])
から文字列型の値が返されるので、式が失敗します。 この値は、数値型の値のみをオペランドとして受け取る算術演算子に渡されます。
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
次の例では、LaborHours
属性の合計を計算しています。 関数はdata()
、製品モデルのすべての<Location
>要素から属性のLaborHours
型指定された値を取得します。 列に関連付けられている XML スキーマに Instruction
従って、 LaborHours
は xs:decimal 型です。
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
このクエリでは、結果として 12.75 が返されます。
注意
この例での data() 関数の明示的な使用は、説明のみを目的としています。 指定しない場合、 sum() はdata() 関数を暗黙的に適用して、ノードの型指定された値を抽出します。