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