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.
Exemples
Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockés dans différentes colonnes de type xml tirées de l'exemple de base de données AdventureWorks2008R2. Pour obtenir une vue d'ensemble 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 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.