データ アクセサー関数 - string (XQuery)
適用対象:SQL Server
文字列として表 $arg の値を返します。
構文
fn:string() as xs:string
fn:string($arg as item()?) as xs:string
引数
$arg
ノードまたはアトミック値です。
解説
$argが空のシーケンスの場合は、長さ 0 の文字列が返されます。
$argがノードの場合、関数は文字列値アクセサーを使用して取得されたノードの文字列値を返します。 これは、W3C XQuery 1.0 および XPath 2.0 データ モデル仕様で定義されています。
$argがアトミック値の場合、関数は、特に明記されていない場合を除き、xs:string,$arg としてキャストされた式によって返されるのと同じ文字列を返します。
$argの型が xs:anyURI の場合、URI は特殊文字をエスケープせずに文字列に変換されます。
この実装では、引数のない fn:string() は、コンテキスト依存述語のコンテキストでのみ使用できます。 具体的には、角かっこ ([ ]) 内でのみ使用できます。
例
このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納されている XML インスタンスに対する XQuery の例を示します。
A. 文字列関数の使用
次のクエリでは、 要素の <Features
> 子要素ノードを <ProductDescription
> 取得します。
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 yearsparts and labor...
B. さまざまなノードで文字列関数を使用する
次の例では、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])')
次のクエリでは、コメント ノードの文字列値を取得し、テキスト ノードを返します。
select @x.query('string(/comment()[1])')
結果を次に示します。
This is a comment