Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
gäller för:SQL Server
Returnerar längden på strängen i tecken.
Syntax
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Argument
$arg
Källsträng vars längd ska beräknas.
Anmärkningar
Om värdet för $arg är en tom sekvens returneras ett xs:heltal värdet 0.
Beteendet för surrogatpar i XQuery-funktioner beror på databasens kompatibilitetsnivå. Om kompatibilitetsnivån är 110 eller senare räknas varje surrogatpar som ett enda tecken. För tidigare kompatibilitetsnivåer räknas de som två tecken. Mer information finns i ALTER DATABASE Compatibility Level (Transact-SQL) and Collation and Unicode Support.
Om värdet innehåller ett Unicode-tecken på 4 byte som representeras av två surrogattecken räknar SQL Server surrogattecken individuellt.
string-length() utan en parameter kan endast användas i ett predikat. Följande fråga returnerar till exempel elementet <ROOT>:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Kompletterande tecken (surrogatpar)
Beteendet för surrogatpar i XQuery-funktioner beror på databasens kompatibilitetsnivå och i vissa fall på standardnamnområdes-URI:n för funktioner. Mer information finns i avsnittet "XQuery Functions Are Surrogate-Aware" i avsnittet Breaking Changes to Database Engine Features in SQL Server 2016. Se även ALTER DATABASE Compatibility Level (Transact-SQL) and Collation and Unicode Support.
Exempel
Det här avsnittet innehåller XQuery-exempel mot XML-instanser som lagras i olika XML- typkolumner i AdventureWorks-databasen.
A. Använda XQuery-funktionen string-length() för att hämta produkter med långa sammanfattningsbeskrivningar
För produkter vars sammanfattningsbeskrivning är större än 50 tecken hämtar följande fråga produkt-ID, längden på sammanfattningsbeskrivningen och själva sammanfattningen <Summary> elementet.
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;
Observera följande från föregående fråga:
Villkoret i WHERE-satsen hämtar endast de rader där sammanfattningsbeskrivningen som lagras i XML-dokumentet är längre än 200 tecken. Den använder metoden value() (XML-datatyp).
SELECT-satsen konstruerar bara den XML som du vill använda. Den använder metoden query() (XML-datatyp) för att konstruera XML och ange det nödvändiga XQuery-uttrycket för att hämta data från XML-dokumentet.
Detta är ett partiellt resultat:
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. Använda XQuery-funktionen string-length() för att hämta produkter vars garantibeskrivningar är korta
För produkter vars garantibeskrivningar är mindre än 20 tecken långa hämtar följande fråga XML som innehåller produkt-ID, längd, garantibeskrivning och själva <Warranty>-elementet.
Garanti är en av produktfunktionerna. Ett valfritt <Warranty> underordnat element följer efter elementet <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;
Observera följande från föregående fråga:
pd och wm är de namnområdesprefix som används i den här frågan. De identifierar samma namnområden som används i dokumentet som efterfrågas.
XQuery anger en kapslad FOR-loop. Den yttre FOR-loopen krävs eftersom du vill hämta ProductModelID- attribut för <
ProductDescription>-elementet. Den inre FOR-loopen krävs, eftersom du bara vill ha de produkter som har garantifunktionsbeskrivningar som är mindre än 20 tecken långa.
Detta är det partiella resultatet:
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>
...