次の方法で共有


データ アクセサー関数 - 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) は、型指定されていないため、 <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>  

次のクエリでは、 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 関数