Mam wartość XML taką jak ta:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Chcę złączyć wszystkie I
wartości i zwraca je w postaci pojedynczego łańcucha: ABC...
.
Teraz wiem, że mogę zniszczyć XML, zsumować wyniki jako XML bez węzłów i zastosować .values('text()[1]', ...)
do wyniku:
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)')
;
Chciałbym jednak to wszystko zrobić przy użyciu tylko metod XPath / XQuery, coś takiego:
SELECT @MyXml. ? ( ? );
Czy istnieje taki sposób?
Powodem, dla którego szukam rozwiązania w tym kierunku, jest fakt, że mój rzeczywisty XML zawiera również inne elementy, na przykład:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
I chciałbym móc wyodrębnić zarówno I
wartości jako pojedynczy ciąg znaków, jak i J
wartości jako pojedynczy ciąg znaków bez konieczności używania nieporęcznego skryptu dla każdego z nich.
źródło
W zależności od faktycznej struktury XML można rozważyć użycie takiej pętli:
co daje to:
Zobacz to skrzypce
źródło
Jeśli twoje elementy i wartości są naprawdę krótkie i wyraźne, działa to:
Jednak w przypadku nietrywialnych plików XML może to być problem.
źródło