Fonction string-length (XQuery)

Retourne la longueur de la chaîne en caractères.

Syntaxe

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

Arguments

  • $arg
    Chaîne source dont la longueur doit être calculée.

Notes

Si la valeur de $arg est une séquence vide, une valeur xs:integer égale à 0 est renvoyée.

Si la valeur contient un caractère Unicode composé de 3 octets et représenté par deux caractères de substitution, SQL Server compte ces caractères de substitution séparément.

La fonction string-length() ne peut être utilisée sans paramètre que dans un prédicat. Par exemple, la requête suivante renvoie l'élément <ROOT> :

declare @x xml;
set @x='<ROOT>Hello</ROOT>';
select @x.query('/ROOT[string-length()=5]');

Exemples

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockés dans différentes colonnes de type xml tirées de la base de données AdventureWorks2008R2. Pour obtenir une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.

A. Utilisation de la fonction XQuery string-length() pour extraire les produits dont la description résumée présente une certaine longueur

Pour les produits dont la description résumée comprend plus de 50 caractères, la requête suivante extrait l'ID de produit, la longueur de la description résumée, ainsi que le résumé proprement dit, représenté par l'élément <Summary>.

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;

Notez les points suivants par rapport à la requête ci-dessus :

  • La condition de la clause WHERE extrait uniquement les lignes où la description résumée stockée dans le document XML comprend plus de 200 caractères. Elle utilise la méthode value() (type de données XML).

  • La clause SELECT construit simplement le document XML de votre choix. Elle utilise la méthode query() (type de données XML) pour construire le document XML et spécifier l'expression XQuery nécessaire à l'extraction des données de ce document.

Voici un extrait du résultat :

Résultat

-------------------

<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. Utilisation de la fonction XQuery string-length() pour extraire les produits dont la description de la garantie est très courte

Pour les produits dont la description de la garantie comprend moins de 20 caractères, la requête suivante extrait des données XML qui indiquent l'ID de produit, la longueur, la description de la garantie et l'élément <Warranty> proprement dit.

La garantie est l'une des caractéristiques du produit. Un élément enfant <Warranty> facultatif suit l'élément <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;

Notez les points suivants par rapport à la requête ci-dessus :

  • pd et wm sont les préfixes d'espace de noms utilisés dans cette requête. Ils identifient les mêmes espaces de noms que ceux utilisés dans le document interrogé.

  • La requête XQuery spécifie une boucle FOR imbriquée. La boucle FOR externe est requise car vous souhaitez extraire les attributs ProductModelID de l'élément <ProductDescription>. La boucle FOR interne est requise car vous ne souhaitez obtenir que les produits dont la description de la garantie comprend moins de 20 caractères.

Voici le résultat partiel :

Résultat

-------------------------

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

...