Мой Kbyte.Ru
Рассылка Kbyte.Ru
Партнеры Kbyte.Ru
Реклама
Сделано руками
Сделано руками
> Исходные коды - Алексей Немиро -

Microsoft SQL Server - Работа с XML/XSL

Все примеры / Работа с XML/XSL

Вывод данных в XML-формате средствами MS SQL Server

Автор: Алексей Немиро | добавлено: 04.08.2010, 18:38 | просмотров: 4514 (2+) | комментариев: 0 | рейтинг: *x6
Иногда, в сложных запросах, требуется вывести данные из разных таблиц, при этом желательно за один шаг и без ущерба для производительности. Например, есть три таблицы: записи, метки (тэги), связь записей и меток. Требуется вывести список записей с метками.

Инструкции

Предполагается, что в базе есть таблицы:
entries - записи
tags - метки
entries_in_tags - связь записей с метками

Иногда, в сложных запросах, требуется вывести данные из разных таблиц, при этом желательно за один шаг и без ущерба для производительности.
Например, есть три таблицы: записи, метки (тэги), связь записей и меток. Требуется вывести список записей с метками.

Конечно, можно сделать один запрос на получение списка записей и далее делать дополнительные запросы к SQL Server непосредственно при выводи записи, но это негативно отразится на производительности.

Как вариант, можно написать отдельную SQL-функцию, которая будет возвращать список меток в определенном формате, например, через запятую, и использовать эту функцию в SQL-запросе получения списка записей. Если с метками такой способ вполне себя оправдает, то с чем-то более крупным, например, если потребуется вывести многострочные текстовые данные, возникнут проблемы, придется, откровенно говоря, извращаться. К тому же использование функций также негативно отразится на производительности.

В MS SQL Server для подобных задач существуют средства для работы с XML. См. примеры ниже.

Код

-- вывод всех меток в формате XML при помощи инструкции FOR XML, 
-- инструкции AUTO указывает на то, 
-- что SQL Server сам определяет структуру XML-данных
SELECT * FROM tags FOR XML AUTO 

-- вывод записей, и меток в колонку tags
SELECT e.*, 
(SELECT tags.tag FROM entries_in_tags 
INNER JOIN tags ON tags.id_tags = entries_in_tags.id_tags 
WHERE id_entries = e.id_entries FOR XML AUTO) AS tags 
FROM entries AS e

-- сами определяем структуру XML-данных
SELECT e.*, 
(SELECT tags.tag AS '@tag' FROM entries_in_tags 
INNER JOIN tags ON tags.id_tags = entries_in_tags.id_tags WHERE id_entries = e.id_entries 
FOR XML PATH ('item'), TYPE, ELEMENTS, ROOT('root')) AS tags 
FROM entries AS e

-- будут вопросы, пишите на форум: http://kbyte.ru/ru/Forums
Об авторе

Алексей Немиро

Интернет-деятель. Автор многочисленных статей и переводов статей по программированию и информационным технологиям. Работы Алексея можно найти в популярных печатных изданиях компьютерной тематики. Автор проекта Kbyte.Ru.
Сейчас Алексей занимается профессиональным Web-программированием на базе технологий .NET Framework. Иногда пишет различные программки и компоненты для Windows и Android. В свободное время занимается Web-дизайном, увлекается фото- и видеосъемкой.

См. также:
Профиль автора
Алексей Немиро
Последние комментарии (всего: 0)

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учетная запись на Kbyte.Ru, пройдите процедуру авторизации OpenID.
Если Вы еще не зарегистрированы на Kbyte.Ru - зарегистрируйтесь.


Нет комментариев...

Авторизация
 
OpenID
Зарегистрируйся и получи 10% скидку на добавление своего сайта в каталоги! Подробнее »
Поиск по сайту
Реклама
Счетчики