Dela via


Funktioner på strängvärden – stränglängd

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

Se även

XQuery Functions mot xml-datatypen