Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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>
...