次の方法で共有


型システム (XQuery)

適用対象: SQL Server

XQuery は、スキーマ型に対して厳密に型指定された言語であり、型指定されていないデータの場合は弱く型指定された言語です。 XQuery の定義済みの型は次のとおりです。

このトピックでは、次についても説明します。

XML スキーマの組み込み型

組み込みの型の XML スキーマには、定義済みの名前空間プレフィックス xs があります。 これらの型には、 xs:integerxs: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()関数を使用して、ノードの値を取得できます。

次の 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 スキーマに従って、LaborHoursxs: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() 関数を適用して、ノードの型指定された値を抽出します。

参照

SQL Server プロファイラーのテンプレートとアクセス許可
XQuery の基礎