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.

Le comportement de paires de substitution dans les fonctions XQuery dépend du niveau de compatibilité de la base de données. Si le niveau de compatibilité est 110 ou supérieur, chaque paire de substitution est comptée comme un caractère unique. Pour les premiers niveaux de compatibilité, ils sont comptés comme deux caractères. Pour plus d'informations, consultez Niveau de compatibilité ALTER DATABASE (Transact-SQL) et Prise en charge d'Unicode et du classement.

Si la valeur contient un caractère Unicode composé de 4 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]');

Caractères supplémentaires (paires de substitution)

Le comportement de la paire de substitution dans des fonctions XQuery dépend du niveau de compatibilité de la base de données et, dans certains cas, de l'URI de l'espace de noms par défaut des fonctions. Pour plus d'informations, consultez la section « Les fonctions XQuery prennent en charge la substitution » dans la rubrique Changements essentiels dans les fonctionnalités du moteur de base de données de SQL Server 2012. Consultez également Niveau de compatibilité ALTER DATABASE (Transact-SQL) et Prise en charge d'Unicode et du classement.

Exemples

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockées dans différentes colonnes de type xml tirées de la base de données AdventureWorks.

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 à propos de la requête précédente :

  • 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 résultat partiel :

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

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

Voir aussi

Référence

Fonctions XQuery impliquant le type de données xml