Методы типа данных XML стр. 6 |
|||||||||||||||||||||||||||||||||||||||||
Метод nodes()Разбивает XML-структуру на одно или несколько поддеревьев, в соответствии с указанным выражением XPath. Выполним следующий запрос:
Данный запрос разобьет исходную структуру на строки, по количеству элементов "album" и вернет по две строки для каждого исполнителя:
Разберем текст запроса подробнее. CROSS APPLY A.xmlData.nodes('/albums[1]/album') – разбивает каждую строку таблицы на столько строк, сколько элементов "album" было найдено. col – это имя производной таблицы, а album – это имя столбца. Они нужны будут для дальнейшей работы с результатами. album.query('.') – здесь осуществляется запрос к каждой строке результатов, при помощи псевдонима. Данный подзапрос просто выбирает все данные из поддерева. Разберём другой пример. Допустим мы хотим получить в виде таблицы первые две песни каждого альбома для каждой из групп.
[position()<=2] – указывает, что нам нужны только два первых элемента "song" внутри каждого элемента "album". '../@title' – обращается к родительскому элементу и берёт его атрибут @title. Результат отобразился корректно, но при больших объёмах данных такой запрос будет крайне медленным и неэффективным. Причина заключается в том, что для каждой песни среда выполнения запроса ищет родительский элемент и считывает его атрибут. Перепишем запрос следующим образом:
Результат будет аналогичным, однако теперь логика запроса изменена следующим образом: сначала выбираются все альбомы, а потом для каждого альбома будут присоединяться песни. Поскольку песен всегда будет намного больше, чем альбомов, выполнение данного запроса покажет существенный прирост производительности по сравнению с предыдущим. |