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 2012 中對於 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;
請注意下列項目是從上一個查詢而來:
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>
...