J'ai une valeur XML comme celle-ci:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Je veux concaténer toutes les I
valeurs et les retourner comme une seule chaîne: ABC...
.
Maintenant, je sais que je peux déchiqueter le XML, agréger les résultats en tant que XML sans nœud et appliquer .values('text()[1]', ...)
au résultat:
SELECT
(
SELECT
n.n.value('text()[1]', 'varchar(50)') AS [text()]
FROM
@MyXml.nodes('/R/I') AS n (n)
FOR XML
PATH (''),
TYPE
).value('text()[1]', 'varchar(50)')
;
Cependant, je voudrais faire tout cela en utilisant uniquement des méthodes XPath / XQuery, quelque chose comme ceci:
SELECT @MyXml. ? ( ? );
Existe-t-il un tel moyen?
La raison pour laquelle je recherche une solution dans ce sens est que mon XML actuel contient également d'autres éléments, par exemple:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
Et je voudrais pouvoir extraire à la fois les I
valeurs sous forme de chaîne unique et les J
valeurs sous forme de chaîne unique sans avoir à utiliser un script lourd pour chacune.
la source
En fonction de votre structure XML réelle, vous pouvez envisager d'utiliser une boucle comme celle-ci:
qui produit ceci:
Voir ce violon
la source
Si vos éléments et valeurs sont vraiment courts et distincts, cela fonctionne:
Pour le XML non trivial, il peut cependant être difficile.
la source