Eu tenho um valor XML como este:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Quero concatenar todos os I
valores e retorná-los como uma única sequência:ABC...
.
Agora eu sei que posso fragmentar o XML, agregar os resultados novamente como um XML sem assentimento 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, eu gostaria de fazer tudo isso usando apenas métodos XPath / XQuery, algo como isto:
SELECT @MyXml. ? ( ? );
Existe tal maneira?
O motivo pelo qual estou procurando uma solução nessa direção é porque meu XML real também contém outros elementos, 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 sequência e os J
valores como uma única sequência sem precisar usar um script pesado para cada um.
fonte
Dependendo da sua estrutura XML real, você pode considerar usar um loop como este:
que gera isso:
Veja este violino
fonte
Se seus elementos e valores são realmente curtos e distintos, isso funciona:
Para XML não trivial, pode ser difícil.
fonte