Share via


文字列値に使用する関数 - 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)」 および 「照合順序と 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)照合順序と 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;  

上のクエリに関して、次の点に注意してください。

これは部分的な結果です。

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、長さ、保証の説明、および要素自体を含む XML を <Warranty> 取得します。

保証は、製品の機能の 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;  

上のクエリに関して、次の点に注意してください。

  • pdwm は、このクエリで使用される名前空間プレフィックスです。 これらは、クエリ対象のドキュメントで使用されている同じ名前空間を示します。

  • XQuery は、入れ子になった FOR ループを指定します。 要素の ProductModelID 属性を取得するため、外側の FOR ループが <ProductDescription> 必要です。 保証機能の説明が 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>  
...  

参照

xml データ型に対する XQuery 関数