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
請注意下列項目是從上一個查詢而來:
pd 及 wm 是此查詢中使用的名稱空間前置詞。它們可識別被查詢的文件中是否使用的相同名稱空間。
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>
...