data 関数 (XQuery)

$arg で指定されたアイテムごとに型指定された値を返します。

構文

fn:data ($arg as item()*) as xdt:untypedAtomic*

引数

  • $arg
    型指定された値を返す対象となるアイテムのシーケンス。

説明

型指定された値には、次のことが当てはまります。

  • アトミック値の型指定された値は、アトミック値になります。

  • テキスト ノードの型指定された値は、そのテキスト ノードの文字列値になります。

  • コメントの型指定された値は、そのコメントの文字列値になります。

  • 処理命令の型指定された値は、その処理命令の内容になります。このとき、処理命令の操作対象名は含まれません。

  • ドキュメント ノードの型指定された値は、その文字列値になります。

属性ノードと要素ノードには、次のことが当てはまります。

  • 属性ノードが XML スキーマ型で型指定されている場合、このノードの型指定された値は XML スキーマ型に応じた型の値になります。

  • 属性ノードが型指定されていない場合、このノードの型指定された値は xdt:untypedAtomic インスタンスとして返される文字列値と同じになります。

  • 要素ノードが型指定されていない場合、このノードの型指定された値は xdt:untypedAtomic インスタンスとして返される文字列値と同じになります。

型指定された要素ノードには、次のことが当てはまります。

  • 要素に単純型のコンテンツが含まれている場合、data() はこの要素の型指定された値を返します。

  • 要素ノードが、xs:anyType などの複合型の場合、data() は静的エラーを返します。

多くの場合、data() 関数を使用する必要はありませんが、以下の例に示すように data() 関数を明示的に指定することで、クエリが読みやすくなります。詳細については、「XQuery の基礎」を参照してください。

次に示すように、構築済み XML で data() を指定することはできません。

declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')

このトピックでは、AdventureWorks データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行される XQuery の例を紹介します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。

A. data() XQuery 関数によるノードの型指定された値の抽出

次のクエリでは、data() 関数を使用して、属性、要素、テキスト ノードの値を取得します。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query(N'
 for $pd in //p1:ProductDescription
 return 
    <Root 
      ProductID = "{ data( ($pd//@ProductModelID)[1] ) }" 
      Feature =   "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
    </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

次に結果を示します。

<Root ProductID="19" Feature="parts and labor"/>

前述のとおり、属性の構築時には data() 関数を省略できます。data() 関数を指定しないと、暗黙的に処理されます。次のクエリは、前のクエリと同じ結果を生成します。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
      for $pd in //p1:ProductDescription
         return 
          <Root  
                ProductID = "{ ($pd/@ProductModelID)[1] }"  
                Feature =   "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
           </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

次の例は、data() 関数が必要なインスタンスを示します。

次のクエリでは、$pd/p1:Specifications/Material が <Material> 要素を返します。また、data($pd/p1:Specifications/ Material) は、<Material> が型指定されていないので、xdt:untypedAtomic 型の文字データを返します。入力が型指定されていない場合は、data() の結果は、xdt:untypedAtomic に型指定されます。

SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $pd in //p1:ProductDescription
         return 
          <Root>
             { $pd/p1:Specifications/Material }
             { data($pd/p1:Specifications/Material) }
           </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

次に結果を示します。

<Root>
  <Material>Almuminum Alloy</Material>Almuminum Alloy
</Root>

次のクエリでは、<Warranty> は複合型の要素なので、data($pd/p1:Features/wm:Warranty) は静的エラーを返します。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
 <Root>
   {     /p1:ProductDescription/p1:Features/wm:Warranty }
   { data(/p1:ProductDescription/p1:Features/wm:Warranty) }
 </Root>
 ') as Result
FROM  Production.ProductModel
WHERE ProductModelID = 23