Published on

July 2, 2012

Создание строки, разделенной запятыми, из нескольких узлов XML в SQL Server

Вам когда-нибудь приходилось преобразовывать структуру 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. Оно предоставляет самодостаточное решение, которое легко интегрируется в ваши существующие преобразования.

Счастливого кодирования!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.