Freigeben über


string-length-Funktion (XQuery)

Gibt die Länge der Zeichenfolge in Zeichen zurück.

Syntax

fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer

Argumente

  • $arg
    Quellzeichenfolge, deren Länge berechnet werden soll.

Hinweise

Wenn der Wert von $arg eine leere Sequenz ist, wird ein xs:integer-Wert von 0 zurückgegeben.

Das Verhalten von Ersatzpaaren in XQuery-Funktionen hängt vom Kompatibilitätsgrad der Datenbank ab. Beim Kompatibilitätsgrad 110 oder höher wird jedes Ersatzpaar als einzelnes Zeichen gezählt. Bei niedrigeren Kompatibilitätsgraden werden Ersatzpaare als zwei Zeichen betrachtet. Weitere Informationen finden Sie unter ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL) und Sortierung und Unicode-Unterstützung.

Wenn der Wert ein 4-Byte-Unicode-Zeichen enthält, das durch zwei Ersatzzeichen dargestellt wird, zählt SQL Server die Ersatzzeichen einzeln.

Die string-length()-Funktion ohne Parameter kann nur in einem Prädikat verwendet werden. Beispielsweise gibt die folgende Abfrage das <ROOT>-Element zurück:

DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');

Ergänzende Zeichen (Ersatzpaare)

Das Verhalten von Ersatzzeichenpaaren in XQuery-Funktionen hängt vom Kompatibilitätsgrad der Datenbank ab und in einigen Fällen vom Standardnamespace-URI für Funktionen. Weitere Informationen finden Sie im Abschnitt "XQuery-Funktionen sind ersatzzeichenabhängig" im Thema Fehlerhafte Änderungen an Funktionen des Datenbankmoduls in SQL Server 2012. Siehe auch ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL) und Sortierung und Unicode-Unterstützung.

Beispiele

Dieses Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten vom xml-Datentyp in der AdventureWorks-Datenbank gespeichert sind.

A.Verwenden der string-length()-Funktion von XQuery zum Abrufen von Produkten mit langen Zusammenfassungsbeschreibungen

Für Produkte, deren Zusammenfassungsbeschreibung größer als 50 Zeichen ist, ruft die folgende Abfrage die Produkt-ID, die Länge der Zusammenfassungsbeschreibung sowie die Zusammenfassung selbst (das <Summary>-Element) ab.

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;

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Die Bedingung in der WHERE-Klausel ruft nur die Zeilen ab, für die die im XML-Dokument gespeicherte Zusammenfassung länger als 200 Zeichen ist. Sie verwendet die value()-Methode (XML-Datentyp).

  • Die SELECT-Klausel erstellt nur das von Ihnen gewünschte XML. Sie verwendet die query()-Methode (XML-Datentyp) zum Erstellen des XMLs und zum Angeben des erforderlichen XQuery-Ausdrucks zum Abrufen von Daten aus dem XML-Dokument.

Dies ist das Teilergebnis:

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.Verwenden der string-length()-Funktion von XQuery zum Abrufen von Produkten, deren Garantiebeschreibungen kurz sind

Für Produkte, deren Garantiebeschreibung weniger als 20 Zeichen lang ist, ruft die folgende Abfrage XML ab, das die Produkt-ID, die Länge, die Garantiebeschreibung und das <Warranty>-Element selbst enthält.

Die Garantie ist eine der Produktfunktionen. Ein optionales untergeordnetes <Warranty>-Element folgt nach dem <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;

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • pd und wm sind die Namespacepräfixe, die in dieser Abfrage verwendet werden. Sie geben den gleichen Namespace an, der in dem Dokument verwendet wird, das abgefragt wird.

  • Die XQuery gibt eine geschachtelte FOR-Schleife an. Die äußere FOR-Schleife ist erforderlich, da Sie die ProductModelID-Attribute des <ProductDescription>-Elements abrufen möchten. Die innere FOR-Schleife ist erforderlich, weil Sie nur die Produkte abrufen möchten, die Garantiefunktionsbeschreibungen besitzen, die kürzer als 20 Zeichen sind.

Dies ist das Teilergebnis:

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

Siehe auch

Verweis

XQuery-Funktionen für den xml-Datentyp