文字列値に使用する関数 - string-length
適用対象: SQL Server
文字列の長さを文字数で返します。
構文
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
引数
$arg
長さが計算されるソース文字列。
解説
$argの値が空のシーケンスの場合は、xs:integer 値 0 が返されます。
XQuery 関数におけるサロゲート ペアの動作は、データベースの互換性レベルに左右されます。 互換性レベルが 110 以降の場合、各サロゲート ペアは 1 文字としてカウントされます。 互換性レベルがこれ未満の場合は、2 文字としてカウントされます。 詳細については、「 ALTER DATABASE 互換性レベル (Transact-SQL) と Collation および Unicode のサポートを参照してください。
2 つのサロゲート文字で表される 4 バイト Unicode 文字が値に含まれている場合、SQL Server はサロゲート文字を個別にカウントします。
パラメーターのない string-length() は、述語内でのみ使用できます。 たとえば、次のクエリは <ROOT
> 要素を返します。
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
補助文字 (サロゲート ペア)
XQuery 関数でのサロゲート ペアの動作は、データベース互換性レベルと、場合によっては関数の既定の名前空間 URI によって異なります。 詳細については、「SQL Server 2016 でのデータベース エンジン機能の変更の」の「XQuery 関数はサロゲート対応」セクションを参照してください。 ALTER DATABASE 互換性レベル (Transact-SQL)のとCollation と Unicode のサポートも参照してください。
例
このトピックでは、AdventureWorks データベースのさまざまな xml 型の列に格納されている XML インスタンスに対する XQuery の例を示します。
A. string-length() XQuery 関数を使用して、長い要約説明を含む製品を取得する
概要の説明が 50 文字を超える製品の場合、次のクエリでは、製品 ID、概要の説明の長さ、および概要自体、 <Summary
> 要素が取得されます。
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT CatalogDescription.query('
<Prod ProductID= "{ /pd:ProductDescription[1]/@ProductModelID }" >
<LongSummary SummaryLength =
"{string-length(string( (/pd:ProductDescription/pd:Summary)[1] )) }" >
{ string( (/pd:ProductDescription/pd:Summary)[1] ) }
</LongSummary>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.value('string-length( string( (/pd:ProductDescription/pd:Summary)[1]))', 'decimal') > 200;
上のクエリに関して、次の点に注意してください。
WHERE 句の条件は、XML ドキュメントに格納されている概要の説明が 200 文字を超える行のみを取得します。 value() メソッド (XML データ型)を使用します。
SELECT 句は、必要な XML のみを構築しています。 query() メソッド (XML データ型)を使用して XML を構築し、XML ドキュメントからデータを取得するために必要な XQuery 式を指定します。
これは部分的な結果です。
Result
-------------------
<Prod ProductID="19">
<LongSummary SummaryLength="214">Our top-of-the-line competition
mountain bike. Performance-enhancing options include the
innovative HL Frame, super-smooth front suspension, and
traction for all terrain.
</LongSummary>
</Prod>
...
B. string-length() XQuery 関数を使用して、保証の説明が短い製品を取得する
保証の説明が 20 文字未満の製品の場合、次のクエリでは、製品 ID、長さ、保証の説明、および <Warranty
> 要素自体を含む XML を取得します。
保証は、製品の機能の 1 つです。 省略可能な <Warranty
> 子要素は、 <Features
> 要素の後に続きます。
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
for $ProdDesc in /pd:ProductDescription,
$pf in $ProdDesc/pd:Features/wm:Warranty
where string-length( string(($pf/wm:Description)[1]) ) < 20
return
<Prod >
{ $ProdDesc/@ProductModelID }
<ShortFeature FeatureDescLength =
"{string-length( string(($pf/wm:Description)[1]) ) }" >
{ $pf }
</ShortFeature>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription')=1;
上のクエリに関して、次の点に注意してください。
pd および wm はこのクエリで使用される名前空間プレフィックスです。 これらは、クエリ対象のドキュメントで使用されている同じ名前空間を示します。
XQuery は、入れ子になった FOR ループを指定します。 <
ProductDescription
>要素の ProductModelID 属性を取得するため、外側の FOR ループが必要です。 保証機能の説明が 20 文字未満の製品のみが必要であるため、内部 FOR ループが必要です。
結果の一部を次に示します。
Result
-------------------------
<Prod ProductModelID="19">
<ShortFeature FeatureDescLength="15">
<wm:Warranty
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
</ShortFeature>
</Prod>
...