Fonction string-length (XQuery)

 

S’applique à : SQL Server

THIS TOPIC APPLIES TO: yesSQL Server (starting with 2012)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

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

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

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

Si la valeur de $arg est une séquence vide, un xs : Integer la valeur 0 est retourné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 MODIFIER le niveau de compatibilité de base de DONNÉES &#40 ; Transact-SQL &#41 ; et classement et prise en charge Unicode.

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.

Le Length sans un paramètre peut être utilisé uniquement 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]');  

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 « XQuery fonctions sont substitut prenant en charge » dans la rubrique modifications avec rupture des fonctionnalités du moteur de base de données dans SQL Server 2016. Consultez également MODIFIER le niveau de compatibilité de base de DONNÉES &#40 ; Transact-SQL &#41 ; et classement et prise en charge Unicode.

Cette rubrique fournit des exemples de XQuery sur des instances XML stockés dans différentes xml colonnes de type dans 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 ('http://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 dans 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. Il utilise le méthode value() (type de données XML).

  • La clause SELECT construit simplement le document XML de votre choix. Il utilise le méthode query() (type de données XML) pour construire le document XML et spécifiez l’expression XQuery nécessaire pour récupérer des données à partir du document XML.

Voici un extrait du résultat :

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 (  
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,  
'http://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 dans la requête précédente :

  • 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 extérieure est nécessaire, car vous souhaitez récupérer le ProductModelID les attributs de la <ProductDescription> élément. 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="http://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>  
...  

Fonctions XQuery sur le Type de données xml

Ajouts de la communauté

Afficher: