Как разработчик SQL Server, я часто работаю с XML-данными, хранящимися в базе данных. Одним из мощных инструментов, которыми я часто пользуюсь для преобразования XML, является XQuery. В этой статье блога я расскажу о том, как переместить элементы узлов XML из их текущего расположения на уровень родительского узла с использованием XQuery.
Рассмотрим пример структуры XML, который предоставляет сведения о книге:
<Book>
<BookFormats>
<NumberOfBookFormats>2</NumberOfBookFormats>
<Format Type="Kindle">
<Price>5.00</Price>
<Currency>£</Currency>
<AvailableDate>2010-05-01</AvailableDate>
</Format>
<Format Type="Paperback">
<Price>8.00</Price>
<Currency>£</Currency>
<AvailableDate>2010-03-20</AvailableDate>
</Format>
</BookFormats>
</Book>
Нашей целью является перемещение всех дочерних узлов из узла <BookFormats> на тот же уровень, что и узел <BookFormats>, и полное удаление узла <BookFormats> из XML.
В прошлом для достижения этой цели можно было использовать манипуляции со строками, но XQuery предоставляет гораздо более простой и безопасный подход. Вот пример того, как это можно сделать с помощью XQuery:
SELECT @XML.query('for $x in (/Book) return <Book> {$x/BookFormats/*} </Book>')
Приведенный выше код XQuery использует простое выражение FLOWR для возврата структуры XML, содержащей узел верхнего уровня <Book>, за которым следуют все дочерние узлы под узлом <BookFormats>. Это позволяет эффективно удалить узел <BookFormats> из XML.
Если вы хотите исключить определенные именованные узлы из результата, вы можете использовать функцию local-name(). Вот пример:
SELECT @XML.query('for $x in (/Book) return <Book> {$x/BookFormats/*[local-name(.) != "NumberOfBookFormats"]} </Book>')
В этом примере мы добавляем предикат к коду XQuery для проверки имени каждого дочернего узла под <BookFormats> и исключаем любые узлы с именем “NumberOfBookFormats”.
Используя возможности XQuery, мы легко можем преобразовывать структуры XML в SQL Server, не прибегая к сложной манипуляции строками. Надеюсь, вы найдете эту технику полезной в своих собственных проектах разработки SQL Server!