Delen via


Functies voor tekenreekswaarden - tekenreekslengte

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>  
...  

Zie ook

XQuery-functies op basis van het xml-gegevenstype