У меня есть значение XML, как это:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Я хочу , чтобы объединить все I
значения и возвращает их в виде одной строки: ABC...
.
Теперь я знаю, что могу уничтожить XML, собрать результаты обратно в виде безузлового XML и применить .values('text()[1]', ...)
к результату:
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)')
;
Однако я хотел бы сделать все это, используя только методы XPath / XQuery, что-то вроде этого:
SELECT @MyXml. ? ( ? );
Есть ли такой способ?
Причина, по которой я ищу решение в этом направлении, заключается в том, что мой настоящий XML также содержит другие элементы, например:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
И я хотел бы иметь возможность извлекать как I
значения в виде одной строки, так и J
значения в виде одной строки без необходимости использовать громоздкий скрипт для каждого.
источник
В зависимости от вашей фактической XML-структуры, вы можете рассмотреть возможность использования такого цикла:
который выводит это:
Смотрите эту скрипку
источник
Если ваши элементы и значения действительно короткие и разные, это работает:
Однако для нетривиального XML это может быть сложно.
источник