データ アクセサー関数 - 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