Fonction concat (XQuery)
Accepte zéro ou plusieurs chaînes comme arguments et renvoie une chaîne créée suite à la concaténation des valeurs de chacun de ces arguments.
Syntaxe
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Arguments
- $string
Chaîne facultative à concaténer.
Notes
La fonction requiert au moins deux arguments. Si un argument est une séquence vide, elle est traitée comme une chaîne de longueur zéro.
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 fournit des exemples de requêtes XQuery exécutées sur des instances XML stockées dans diverses colonnes de type xml de l'exemple de la base de données AdventureWorks.
A.Utilisation de la fonction XQuery concat() pour concaténer des chaînes
Pour un modèle de produit spécifique, cette requête renvoie une chaîne obtenue d'après la concaténation de la période et de la description de la garantie. Dans le document de la description du catalogue, l'élément <Warranty> est constitué des éléments enfants <WarrantyPeriod> et <Description>.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductModelName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE PD.ProductModelID=28
Notez les points suivants par rapport à la requête ci-dessus :
Dans la clause SELECT, CatalogDescription est une colonne de type xml. Par conséquent, la méthode query() (type de données XML), Instructions.query(), est utilisée. L'instruction XQuery est spécifiée comme argument de la méthode query.
Le document sur lequel porte la requête utilise des espaces de noms. Par conséquent, le mot clé namespace est utilisé pour définir le préfixe d'espace de noms. Pour plus d'informations, consultez Prologue XQuery.
Voici le résultat obtenu :
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
La requête précédente récupère les informations se rapportant à un produit spécifique. La requête suivante récupère les mêmes informations mais pour tous les produits pour lesquels il existe des descriptions de catalogue XML. Dans la clause WHERE, la méthode exist() du type de données xml renvoie la valeur True si le document XML comporte un élément <ProductDescription> dans ses lignes.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1
Notez que la valeur booléenne retournée par la méthode exist() du type de données xml est comparée à 1.
Limites de la mise en œuvre
Les limites sont les suivantes :
- La fonction concat() dans SQL Server n'accepte que des valeurs de type xs:string. Les autres valeurs doivent être explicitement converties en xs:string ou en xdt:untypedAtomic.