string-length 函數 (XQuery)

傳回字元的字串長度。

語法

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

引數

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

備註

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

XQuery 函數中的 Surrogate 字組行為取決於資料庫相容性層級。 如果相容性層級為 110 以上,每個 Surrogate 字組都會計算成單一字元。 對於舊版的相容性層級來說,它們會算為兩個字元。 如需詳細資訊,請參閱<ALTER DATABASE 相容性層級 (Transact-SQL)>和<定序與 Unicode 支援>。

如果該值包含一個有 4 個位元組但以兩個 Surrogate 字元代表的 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 2014 中對於 Database Engine 的重大變更>主題中的「XQuery 函式是 Surrogate 感知的」一節。 另請參閱<ALTER DATABASE 相容性層級 (Transact-SQL)>和<定序與 Unicode 支援>。

範例

本主題是針對 XML 執行個體提供 XQuery 範例,這些執行個體是儲存在 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>
...

請參閱

參考

針對 xml 資料類型的 XQuery 函數