次の方法で共有


string 関数 (XQuery)

文字列として表現された $arg の値を返します。

構文

fn:string() as xs:string
fn:string($arg as item()?) as xs:string

引数

  • $arg
    ノードまたはアトミック値です。

説明

  • $arg が空のシーケンスの場合、長さゼロの文字列が返されます。

  • $arg がノードの場合、string-value アクセサーを使用して取得したノードの文字列値が返されます。これは、W3C XQuery 1.0 and XPath 2.0 Data Model 仕様で定義されています。

  • $arg がアトミック値の場合、特に他に指定がなければ、式のキャストによって返される文字列と同じ文字列が xs:string 型で返されます。

  • $arg の型が xs:anyURI の場合、URI は特殊文字をエスケープせずに文字列に変換されます。

  • この実装では、引数を指定しないで fn:string() を使用できるのは、コンテキスト依存の述語のコンテキストにおいてのみです。具体的には、角かっこ ([ ]) 内でしか使用できません。

このトピックでは、AdventureWorks2008R2 データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks2008R2 データベースの xml データ型表現」を参照してください。

A. string 関数の使用

次のクエリは、<ProductDescription> 要素の <Features> 子要素ノードを取得します。

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 /PD:ProductDescription/PD:Features
')
FROM Production.ProductModel
WHERE ProductModelID=19

結果の一部を次に示します。

<PD:Features xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">

These are the product highlights.

<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">

<p1:WarrantyPeriod>3 years</p1:WarrantyPeriod>

<p1:Description>parts and labor</p1:Description>

</p1:Warranty>

...

</PD:Features>

string() 関数を指定すると、指定したノードの文字列値が取得されます。

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 string(/PD:ProductDescription[1]/PD:Features[1])
')
FROM Production.ProductModel
WHERE ProductModelID=19;

結果の一部を次に示します。

These are the product highlights.

3 years parts and labor...

B. 異なるノードに対する string 関数の使用

次の例では、XML インスタンスが xml 型の変数に割り当てられています。string() をさまざまなノードに適用した結果を示すクエリを指定しています。

declare @x xml;
set @x = '<?xml version="1.0" encoding="UTF-8" ?>
<!--  This is a comment -->
<root>
  <a>10</a>
just text
  <b attr="x">20</b>
</root>
';

次のクエリは、ドキュメント ノードの文字列値を取得します。この値は、このノードの子孫にあたるすべてのテキスト ノードの文字列値を連結して生成されます。

select @x.query('string(/)');

次に結果を示します。

This is a comment 10

just text

20

次のクエリは、processing-instruction ノードの文字列値を取得します。ただし、このノードにはテキスト ノードが含まれていないため、空のシーケンスが結果として返されます。

select @x.query('string(/processing-instruction()[1])');

次のクエリは、comment ノードの文字列値を取得し、そのテキスト ノードを返します。

select @x.query('string(/comment()[1])');

次に結果を示します。

This is a comment