Вам когда-нибудь приходилось преобразовывать структуру XML в SQL Server и создавать один узел XML, содержащий строку, разделенную запятыми, из значений нескольких других узлов XML? В этой статье мы рассмотрим решение с использованием выражений XQuery.
Давайте рассмотрим следующую структуру XML:
<BookAuthors> <Author>Джон Грин</Author> <Author>Линда Блю</Author> <Author>Питер Ред</Author> <Author>Джилл Уайт</Author> </BookAuthors>
Нашей целью является преобразование этого XML и создание структуры, в которой будет один узел, содержащий все четыре значения в виде строки, разделенной запятыми.
Для достижения этой цели мы можем использовать оператор flwor в XQuery. Оператор flwor будет объединять каждое значение узла <Author> с запятой, за исключением последнего узла в последовательности. Мы можем определить, является ли узел последним в последовательности, используя функцию last() в качестве предиката и сравнивая ее с текущим узлом с помощью оператора is.
Вот пример выражения XQuery, которое выполняет это преобразование:
SELECT @XML.query('
<BookAuthors>
<Authors>
{
for $x in /BookAuthors/Author
return if (not(($x) is (/BookAuthors/Author[last()])[1]))
then concat($x, ",")
else string($x)
}
</Authors>
</BookAuthors>
')
Результатом этого запроса будет:
<BookAuthors> <Authors>Джон Грин, Линда Блю, Питер Ред, Джилл Уайт</Authors> </BookAuthors>
Следует отметить, что поскольку мы создаем последовательность атомарных значений во время оператора flwor, XQuery объединяет эти значения и заполняет их пробелом. Это приводит к наличию пробела после каждой запятой. Хотя это может быть не идеально, это обычно не является проблемой для большинства случаев использования.
Так что, в следующий раз, когда вам понадобится преобразовать структуру XML и создать строку, разделенную запятыми, из нескольких узлов XML в SQL Server, попробуйте использовать это выражение XQuery. Оно предоставляет самодостаточное решение, которое легко интегрируется в ваши существующие преобразования.
Счастливого кодирования!