substring 関数 (XQuery)
$startingLoc の値で示された位置から $length の値で示された文字数分の $sourceString の値を返します。
構文
fn:substring($sourceString as xs:string?,
$startingLoc as as xs:decimal?) as xs:string?
fn:substring($sourceString as xs:string?,
$startingLoc as xs:decimal?,
$length as xs:decimal?) as xs:string?
引数
$sourceString
取得対象の文字列です。$startingLoc
取得対象文字列中で取得を開始する場所を示します。この値が負の値や 0 の場合、0 より後の位置にある文字のみが返されます。$sourceString の長さよりも大きい値が指定された場合は、長さ 0 の文字列が返されます。$length
[オプション] 取得する文字数です。指定されなかった場合は、$startingLoc で指定された場所以降にある文字列の文字がすべて返されます。
説明
この関数で引数を 3 つとも指定した場合、$sourceString 内で、次の範囲内の位置 $p から文字列が返されます。
fn:round($startingLoc) <= $p < fn:round($startingLoc) + fn:round($length)
$length の値は、開始位置以降の $sourceString の値の文字数よりも大きくてもかまいません。この場合、$sourceString の最後までの文字が部分文字列として返されます。
文字列の最初の文字の位置は 1 です。
$sourceString の値が空のシーケンスの場合は、長さ 0 の文字列として処理されます。$sourceString の値が空のシーケンスではなく、$startingLoc または $length のいずれかが空のシーケンスの場合は、空のシーケンスが返されます。
例
このトピックでは、AdventureWorks2008R2 データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks2008R2 データベースの xml データ型表現」を参照してください。
A. XQuery の substring() 関数を使用して製品モデルの説明の概要の一部を取得する
このクエリは、製品モデルを説明するテキスト (XML ドキュメントの <Summary> 要素) から、最初の 50 文字を取得します。
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
<Prod>{ substring(string((/pd:ProductDescription/pd:Summary)[1]), 1, 50) }</Prod>
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('/pd:ProductDescription') = 1;
上のクエリに関して、次の点に注意してください。
string() 関数は、<Summary> 要素の文字列値を返します。<Summary> 要素にはテキストとサブ要素 (HTML の書式要素) の両方が含まれていますが、これらの要素を省いてテキストだけを取得するために、この関数が使われています。
substring() 関数は、string() 関数により取得された文字列値の最初の 50 文字を取得します。
結果の一部を次に示します。
ProductModelID の結果
-------------- -----------------------------------------
19 <Prod>Our top-of-the-line competition mountain bike.</Prod>
23 <Prod>Suitable for any type of riding, on or off-roa</Prod>
...
実装の制限事項
制限事項を次に示します。
SQL Server では、$startingLoc および $length parameters の型が xs:double ではなく xs:decimal である必要があります。
SQL Server では、空のシーケンスが () にマップされる動的エラーの結果の値になる場合があるため、$startingLoc および $length の値に空のシーケンスを使用することができます。
Unicode UTF-16 のサロゲート ペアは、1 文字ではなく 2 文字として計算されます。