Eu tenho um valor XML como este:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Eu quero concatenar todos os I
valores e devolvê-los como uma única string: ABC...
.
Agora eu sei que posso destruir o XML, agregar os resultados de volta como um XML sem nó e aplicar .values('text()[1]', ...)
ao resultado:
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)')
;
No entanto, gostaria de fazer tudo isso usando apenas métodos XPath/XQuery, algo assim:
SELECT @MyXml. ? ( ? );
Existe tal maneira?
A razão pela qual estou procurando uma solução nesse sentido é porque meu XML real contém outros elementos também, por exemplo:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
E eu gostaria de poder extrair os I
valores como uma única string e os J
valores como uma única string sem ter que usar um script complicado para cada um.
Isso pode funcionar para você:
Ele pega todos os
text()
elementos do primeiroR
e abaixo.Se você só quer tudo
text()
que você pode fazerSe você quiser os valores para
I
eJ
separados, faça isso.Dependendo da sua estrutura XML real, você pode considerar usar um loop como este:
que emite isso:
Veja este violino
Se seus elementos e valores realmente são curtos e distintos, isso funciona:
No entanto, para XML não trivial, pode ser difícil.