次の方法で共有


データ アクセサー関数 - data (XQuery)

適用対象: SQL Server

$argで指定された各項目の型指定された値を返します。

構文

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

引数

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

解説

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

  • アトミック値の型指定された値はアトミック値です。

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

  • コメントの型指定された値は、コメントの文字列値です。

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

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

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

  • 属性ノードが 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 の例を示します。

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) は、xdt:untypedAtomic として型指定された文字データを返します。これは、 <Material> が型指定されていないためです。 入力が型指定されていない場合、 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>Aluminum Alloy</Material>Aluminum Alloy  
</Root>  

次のクエリでは、 data($pd/p1:Features/wm:Warranty) は静的エラーを返します。これは、 <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  

参照

xml データ型に対する XQuery 関数