型システム (XQuery)
適用対象: SQL Server
XQuery は、スキーマ型に対して厳密に型指定された言語であり、型指定されていないデータの場合は弱く型指定された言語です。 XQuery の定義済みの型は次のとおりです。
http://www.w3.org/2001/XMLSchema名前空間の XML スキーマの組み込み型。
http://www.w3.org/2004/07/xpath-datatypes名前空間で定義されている型。
このトピックでは、次についても説明します。
型指定された値とノードの文字列値。
式によって返されるシーケンス型に一致します。
XML スキーマの組み込み型
組み込みの型の XML スキーマには、定義済みの名前空間プレフィックス xs があります。 これらの型には、 xs:integer と xs:string があります。 これらの組み込み型はすべてサポートされます。 これらの型は、XML スキーマ コレクションを作成するときに使用できます。
型指定された XML のクエリを実行するとき、ノードの静的および動的な型は、クエリの対象の列または変数に関連付けられた XML スキーマ コレクションによって決まります。 静的型と動的型の詳細については、「 Expression Context and Query Evaluation (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()')
Note
型指定された XML インスタンスにクエリを実行して、クエリ式に parent 軸が含まれるときは、結果のノードの静的な型情報は使用できなくなります。 ただし、動的な型はノードに関連付けられています。
型指定された値と文字列値
すべてのノードには、型指定された値と文字列値があります。 型指定された XML データの場合、型指定された値の型は、クエリ対象の列または変数に関連付けられた XML スキーマ コレクションによって提供されます。 型指定されていない XML データの場合、型指定された値の型は xdt:untypedAtomic です。
data()またはstring()関数を使用して、ノードの値を取得できます。
data 関数 (XQuery)は、ノードの型指定された値を返します。
string 関数 (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
属性の型指定された値を取得します。 Instruction
列に関連付けられている XML スキーマに従って、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 が返されます。
Note
この例での data() 関数の明示的な使用は、説明のみを目的としています。 指定されていない場合、 sum() は暗黙的に data() 関数を適用して、ノードの型指定された値を抽出します。