共用方式為


字串值的相關函式 - 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 函式中的 Surrogate 配對行為取決於資料庫相容性層級。 如果相容性層級為 110 或更新版本,則每個代理字組都會計算為單一字元。 針對先前的相容性層級,它們會計算為兩個字元。 如需詳細資訊,請參閱 ALTER DATABASE 相容性層級 (Transact-SQL)定序和 Unicode 支援

如果值包含以兩個 Surrogate 字元表示的 4 位元組 Unicode 字元,SQL Server 會個別計算 Surrogate 字元。

不含參數的 string-length() 只能在述詞內使用。 例如,下列查詢會 <ROOT> 傳回 元素:

DECLARE @x xml;  
SET @x='<ROOT>Hello</ROOT>';  
SELECT @x.query('/ROOT[string-length()=5]');  

補充字元 (Surrogate 字組)

XQuery 函式中 Surrogate 配對的行為取決於資料庫相容性層級,在某些情況下,則取決於函式的預設命名空間 URI。 如需詳細資訊,請參閱 SQL Server 2016 中重大 資料庫引擎 功能變更主題中的一節。 另請參閱 ALTER DATABASE 相容性層級 (Transact-SQL)定序和 Unicode 支援

範例

本主題針對 AdventureWorks 資料庫中各種 xml 類型數據行中儲存的 XML 實例,提供 XQuery 範例。

A. 使用字串長度() XQuery 函式來擷取具有完整摘要描述的產品

對於摘要描述大於 50 個字元的產品,下列查詢會擷取產品標識碼、摘要描述的長度,以及摘要本身的專案 <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 個字元的產品,下列查詢會擷取包含產品標識碼、長度、保固描述和元素本身的 <Warranty> XML。

保固是其中一項產品功能。 選擇性 <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 迴圈。 需要外部 FOR 循環,因為您想要擷取元素的> <ProductDescriptionProductModelID 屬性。 內部 FOR 循環是必要的,因為您只想要具有少於 20 個字元的保固功能描述的產品。

以下是部份結果:

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 函式