Fonctions sur les valeurs de chaîne : string-length
S’applique à :SQL Server
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.
Remarques
Si la valeur de $arg est une séquence vide, une valeur xs:integer de 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 Niveau de compatibilité ALTER DATABASE (Transact-SQL) et Prise en charge du classement et d’Unicode.
Si la valeur contient un caractère Unicode de 4 octets qui est représenté par deux caractères de substitution, SQL Server comptera les caractères de substitution individuellement.
La chaîne length() sans paramètre ne peut être utilisée qu’à l’intérieur d’un prédicat. Par exemple, la requête suivante retourne 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 sont compatibles avec un substitut » dans la rubrique Changements cassants des fonctionnalités du moteur de base de données dans SQL Server 2016. Consultez également Alter DATABASE Compatibility Level (Transact-SQL) et Collation et Prise en charge d’Unicode.
Exemples
Cette rubrique fournit des exemples XQuery sur des instances XML stockées dans différentes colonnes de type xml dans la base de données AdventureWorks.
R. 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écapitulative est supérieure à 50 caractères, la requête suivante récupère l’ID de produit, la longueur de la description récapitulative et le résumé lui-même, 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 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 la méthode value() (type de données XML).
La clause SELECT construit simplement le document XML de votre choix. Il utilise la méthode query() (type de données XML) pour construire le xml et spécifier l’expression XQuery nécessaire pour récupérer des données 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 les descriptions de garantie sont inférieures à 20 caractères, la requête suivante récupère le code XML qui inclut l’ID de produit, la longueur, la description de la garantie et l’élément <Warranty
> lui-même.
La garantie est l'une des caractéristiques du produit. Un élément enfant facultatif <Warranty
> suit après 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 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 externe est requise, car vous souhaitez récupérer 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>
...