Tengo un valor XML como este:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Quiero concatenar todos los I
valores y devolverlos como una sola cadena: ABC...
.
Ahora sé que puedo destruir el XML, agregar los resultados como un XML sin nodo y aplicarlo .values('text()[1]', ...)
al 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)')
;
Sin embargo, me gustaría hacer todo eso usando solo métodos XPath / XQuery, algo como esto:
SELECT @MyXml. ? ( ? );
¿Hay tal manera?
La razón por la que estoy buscando una solución en esta dirección es porque mi XML real también contiene otros elementos, por ejemplo:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
Y me gustaría poder extraer los I
valores como una sola cadena y los J
valores como una sola cadena sin tener que usar un script difícil de manejar para cada uno.
fuente
Dependiendo de su estructura XML real, podría considerar usar un bucle como este:
que produce esto:
Ver este violín
fuente
Si sus elementos y valores son realmente cortos y distintos, esto funciona:
Sin embargo, para XML no trivial puede tener dificultades.
fuente