字串值的相關函式 - 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 中重大 資料庫引擎 功能變更主題中的
範例
本主題針對 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;
請注意下列項目是從上一個查詢而來:
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 個字元的產品,下列查詢會擷取包含產品標識碼、長度、保固描述和元素本身的 <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;
請注意下列項目是從上一個查詢而來:
pd 和 wm 是此查詢中使用的命名空間前置詞。 它們會識別所查詢之檔中所使用的相同命名空間。
XQuery 會指定巢狀 FOR 迴圈。 需要外部 FOR 循環,因為您想要擷取元素的> <
ProductDescription
ProductModelID 屬性。 內部 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>
...