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