Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server-
Retourneert de lengte van de tekenreeks in tekens.
Syntaxis
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Argumenten
$arg
Brontekenreeks waarvan de lengte moet worden berekend.
Opmerkingen
Als de waarde van $arg een lege reeks is, wordt een xs:integer geretourneerd waarde 0.
Het gedrag van surrogaatparen in XQuery-functies is afhankelijk van het compatibiliteitsniveau van de database. Als het compatibiliteitsniveau 110 of hoger is, wordt elk surrogaatpaar geteld als één teken. Voor eerdere compatibiliteitsniveaus worden ze geteld als twee tekens. Zie ALTER DATABASE Compatibility Level (Transact-SQL) en sortering en Unicode-ondersteuningvoor meer informatie.
Als de waarde een Unicode-teken van 4 bytes bevat dat wordt vertegenwoordigd door twee surrogaattekens, telt SQL Server de surrogaattekens afzonderlijk.
De tekenreekslengte() zonder parameter kan alleen worden gebruikt binnen een predicaat. De volgende query retourneert bijvoorbeeld het <ROOT>-element:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Aanvullende tekens (surrogaatparen)
Het gedrag van surrogaatparen in XQuery-functies is afhankelijk van het compatibiliteitsniveau van de database en in sommige gevallen de standaardnaamruimte-URI voor functies. Zie de sectie 'XQuery-functies zijn surrogaatbewust' in het onderwerp Belangrijke wijzigingen in database-enginefuncties in SQL Server 2016. Zie ook ALTER DATABASE Compatibility Level (Transact-SQL) en Collation and Unicode Support.
Voorbeelden
Dit onderwerp bevat XQuery-voorbeelden voor XML-exemplaren die zijn opgeslagen in verschillende xml- typekolommen in de AdventureWorks-database.
Een. De XQuery-functie string-length() gebruiken om producten met lange overzichtsbeschrijvingen op te halen
Voor producten waarvan de samenvattingsbeschrijving langer is dan 50 tekens, haalt de volgende query de product-id, de lengte van de samenvattingsbeschrijving en de samenvatting zelf, het <Summary> element op.
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;
Let op het volgende uit de vorige query:
De voorwaarde in de WHERE-component haalt alleen de rijen op waarin de samenvattingsbeschrijving die is opgeslagen in het XML-document langer is dan 200 tekens. Er wordt gebruikgemaakt van de methode (XML-gegevenstype).
Met de SELECT-component wordt alleen de gewenste XML samengesteld. Het maakt gebruik van de query() methode (XML-gegevenstype) om de XML samen te stellen en de benodigde XQuery-expressie op te geven om gegevens op te halen uit het XML-document.
Dit is een gedeeltelijk resultaat:
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. De XQuery-functie string-length() gebruiken om producten op te halen waarvan de garantiebeschrijvingen kort zijn
Voor producten waarvan de garantiebeschrijvingen minder dan 20 tekens lang zijn, haalt de volgende query XML op die de product-id, lengte, garantiebeschrijving en het <Warranty> element zelf bevat.
Garantie is een van de productfuncties. Een optioneel <Warranty> onderliggend element volgt na het <Features>-element.
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;
Let op het volgende uit de vorige query:
pd en wm zijn de voorvoegsels voor de naamruimte die in deze query worden gebruikt. Ze identificeren dezelfde naamruimten die worden gebruikt in het document waarop een query wordt uitgevoerd.
De XQuery geeft een geneste FOR-lus op. De buitenste FOR-lus is vereist, omdat u de ProductModelID kenmerken van het <
ProductDescription>-element wilt ophalen. De binnenste FOR-lus is vereist, omdat u alleen producten wilt met garantiefuncties die minder dan 20 tekens lang zijn.
Dit is het gedeeltelijke resultaat:
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>
...