XML QUERY: примеры (SQL)

MS SQL функция XML_QUERY: применение и примеры
Раздел: XML функции, Методы типа данных XML
XML_QUERY(XQuery): xml

Описание функции XML_QUERY

В Microsoft SQL Server функция XML_QUERY позволяет выполнять запросы XQuery к данным XML. Использование функции актуально при извлечении фрагментов или значений из XML-документов, хранящихся в столбцах типа XML. Функция применяется в SELECT, WHERE и других разделах SQL-запросов для обработки XML-данных.

Синтаксис функции: xml_column.query('XQuery_expression'). Аргументом является строка с выражением XQuery, которое определяет путь к нужным элементам или атрибутам. Возвращаемое значение — экземпляр типа XML, содержащий результат запроса. Если запрос возвращает пустую последовательность, результатом будет NULL.

Выражения XQuery поддерживают различные конструкции: пути (/, //), предикаты ([]), функции (data(), text()), а также флаги, например, для преобразования типов (xs:integer). Функция позволяет обращаться к элементам, атрибутам, пространствам имён и выполнять фильтрацию по условиям.

Примеры использования XML_QUERY

Пример извлечения элемента из XML:

DECLARE @xml XML = 'Текст';
SELECT @xml.query('/root/item');
Текст

Пример с использованием предиката:

DECLARE @xml XML = '12';
SELECT @xml.query('/items/item[1]');
1

Пример извлечения атрибута:

DECLARE @xml XML = '';
SELECT @xml.query('/product/@code');
code="A123"

Похожие функции в MS SQL

XML_VALUE — извлекает скалярное значение из XML. Отличие от XML_QUERY в возврате одиночного значения (например, строки или числа) вместо XML-фрагмента.

XML_NODES — разбивает XML на строки, возвращая таблицу с узлами. Применяется для преобразования иерархических данных в реляционный формат.

XML_EXIST — проверяет существование узлов в XML, возвращая 1 или 0. Полезен для фильтрации записей в WHERE.

Выбор функции зависит от задачи: XML_QUERY подходит для получения XML-фрагментов, XML_VALUE — для значений, XML_NODES — для табличного представления.

Аналоги функции в других СУБД

Oracle: XMLQUERY работает аналогично, но с другим синтаксисом. Пример:

SELECT XMLQUERY('/root/item' PASSING XMLTYPE('Данные') RETURNING CONTENT) FROM dual;
Данные

PostgreSQL: Используется xpath() или xmltable. Пример:

SELECT xpath('/root/item', 'Текст');
{Текст}

MySQL: Функция ExtractXML() устарела, вместо неё применяется XML_EXTRACT. Пример:

SELECT ExtractXML('Значение', '/root/item');
Значение

В SQLite и Sybase аналогичные функции отсутствуют, требуется обработка на стороне приложения.

Типичные ошибки

Ошибка из-за неправильного пути XQuery:

DECLARE @xml XML = '10';
SELECT @xml.query('/data/val'); -- Несуществующий элемент
NULL

Ошибка при попытке получить несколько значений как скаляр:

DECLARE @xml XML = '12';
SELECT @xml.value('/items/item', 'INT'); -- Ошибка: возвращается несколько узлов
Сообщение об ошибке: "value() requires a singleton node"

Игнорирование пространств имён в XML:

DECLARE @xml XML = 'Тест';
SELECT @xml.query('/root/item'); -- Не найдено из-за пространства имён
NULL

Изменения в последних версиях

В SQL Server 2016 и выше улучшена производительность обработки XQuery для больших XML-документов. Добавлена поддержка дополнительных стандартов XQuery 3.0, например, функции fn:serialize. В более ранних версиях (до 2012 года) некоторые выражения XQuery могли работать медленнее или не поддерживались.

В SQL Server 2019 оптимизировано использование индексов XML при вызове XML_QUERY, что ускоряет выполнение запросов к XML-столбцам.

Расширенные примеры XML_QUERY

Пример с условием в предикате:

Пример sql
DECLARE @xml XML = 'SQL50XML30';
SELECT @xml.query('/books/book[price>40]/title');
SQL

Пример использования функций XQuery:

Пример sql
DECLARE @xml XML = '510';
SELECT @xml.query('sum(/root/*)');
15

Пример с пространствами имён:

Пример sql
DECLARE @xml XML = 'Значение';
SELECT @xml.query('declare namespace x="http://test.com"; /x:root/x:item');
Значение

Пример извлечения данных из атрибутов:

Пример sql
DECLARE @xml XML = '';
SELECT @xml.query('/products/product/@name');
name="Клавиатура"

MS SQL XML_QUERY function comments

En
XML QUERY (XQuery method) Returns an XML fragment from an XML instance