適用於: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。 更多資訊請參閱 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;
請注意下列項目是從上一個查詢而來:
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 循環,因為您想要擷取 屬性。 內部 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>
...