文字列値に使用する関数 - substring
適用対象:SQL Server
$startingLocの値で示される位置から始まる$sourceStringの値の一部を返し、$lengthの値で示される文字数を引き続き返します。
構文
fn:substring($sourceString as xs:string?,
$startingLoc 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 の文字列として処理されます。 それ以外の場合、 $startingLoc または $length が空のシーケンスである場合は、空のシーケンスが返されます。
補助文字 (サロゲート ペア)
XQuery 関数でのサロゲート ペアの動作は、データベース互換性レベルと、場合によっては関数の既定の名前空間 URI によって異なります。 詳細については、SQL Server 2016 のデータベース エンジン機能の破壊的変更に関するトピックの「XQuery 関数はサロゲート対応」セクションを参照してください。 ALTER DATABASE 互換性レベル (Transact-SQL) と 照合順序と Unicode のサポートに関するページも参照してください。
実装の制限事項
SQL Serverでは、$startingLocパラメーターと$length パラメーターが xs:double ではなく xs:decimal 型である必要があります。
SQL Serverでは、動的エラーが () にマップされた結果として空のシーケンスが可能な値であるため、$startingLocと$lengthを空のシーケンスにすることができます。
例
このトピックでは、データベース内のさまざまな xml 型列に格納されている XML インスタンスに対する XQuery の例を AdventureWorks2022
示します。
A. substring() XQuery 関数を使用して製品モデルの部分的な概要の説明を取得する
クエリは、製品モデル <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 Result
-------------- ----------------------------------------------------
19 <Prod>Our top-of-the-line competition mountain bike.</Prod>
23 <Prod>Suitable for any type of riding, on or off-roa</Prod>
...