string-length 函數 (XQuery)

傳回字元的字串長度。

語法

fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer

引數

  • $arg
    要計算其長度的來源字串。

備註

如果 $arg 值是空白時序,則傳回的 xs:integer 值為 0。

如果該值包含一個有 3 個位元組但以兩個 Surrogate 字元代表的 Unicode 字元,SQL Server 將會個別計算 Surrogate 字元。

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

declare @x xml
set @x='<ROOT>Hello</ROOT>'
select @x.query('/ROOT[string-length()=5]')

範例

此主題提供 XML 執行個體的 XQuery 範例,此執行個體儲存在 AdventureWorks 資料庫的不同 xml 類型資料行中。如需這些資料行中每個資料行的概觀,請參閱<在 AdventureWorks 資料庫中的 xml 資料類型表示法>。

A. 使用 string-length() 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

請注意下列項目是從上一個查詢而來:

  • WHERE 子句中的條件會擷取的資料列,只有儲存在 XML 文件中但超過 200 個字元的摘要描述。它會使用value() 方法 (XML 資料類型)

  • SELECT 子句只會建構您想要的 XML。它會使用 query() 方法 (XML 資料類型) 建構 XML,而且指定必要的 XQuery 運算式以擷取 XML 文件的資料。

以下是部份結果:

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 個字元的產品,以下查詢將會擷取的 XML 包含產品識別碼、長度、保證描述及 <Warranty> 元素本身。

Warranty 是產品特性之一。選擇性的 <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 迴圈。因為您想要擷取 <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>
...