Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Построение XML-дерева при самообъединении таблицы  [new]
V-kont
Member

Откуда:
Сообщений: 7
SQL Server 2008. Есть таблица, содержащая ID родителей и детей вида:
IDParent1 - IDChild1
IDParent1 - IDChild2
IDParent2 - IDChild3

Нужно построить XML-дерево по этой таблице. Пытаюсь сделать через самообъединение таблицы и директиву FOR XML PATH, но возникает проблема из-за невозможности применения DISTINCT к списку родителей, т.е. при построении дерева я получаю не IDParent1 с двумя его потомками, а IDParent1 с первым его потомком и IDParent1 со вторым его потомком (если применить GROUP BY к IDParent, то SQL Server требует, чтобы и IDChild были включены в агрегирующую функцию или в GROUP BY).

Кто-нибудь уже сталкивался с необходимостью построения XML-дерева в подобной ситуации?
3 ноя 11, 13:46    [11546060]     Ответить | Цитировать Сообщить модератору
 Re: Построение XML-дерева при самообъединении таблицы  [new]
V-kont
Member

Откуда:
Сообщений: 7
Прошу прощения. Торможу сегодня. Правильный ответ:


DECLARE @shs TABLE (TopParents INT)

INSERT INTO @shs
SELECT DISTINCT
IDSignalP
FROM VirtualFurnace.dbo.VFSignalHasSignal

SELECT shs.TopParents AS "@ID"
,(SELECT DISTINCT
vfshs.IDSignalCh AS "@ID"
FROM VirtualFurnace.dbo.VFSignalHasSignal vfshs
WHERE vfshs.IDSignalP = shs.TopParents
FOR XML PATH('Child'), TYPE
)
FROM @shs shs
FOR XML PATH('Parent')
3 ноя 11, 14:17    [11546318]     Ответить | Цитировать Сообщить модератору
 Re: Построение XML-дерева при самообъединении таблицы  [new]
V-kont
Member

Откуда:
Сообщений: 7
Не, срабатывает только на один уровень вложенности. Кто-нить знает, как можно автоматически генерировать дерево любого уровня вложенности?
3 ноя 11, 14:49    [11546550]     Ответить | Цитировать Сообщить модератору
 Re: Построение XML-дерева при самообъединении таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
V-kont
дерево любого уровня вложенности
В общем виде забейте. Только частные ограниченные решения
Не скулем единым, да и вообще генерировать/парсить XML в RDBS не просто плохой тон. И к тому же есть куча средств сделать это по человечески.
Т.е. не откладывайте вынос работы с XML из БД до момента когда до вас допрёт эта истина, сделайте это прямо сейчас.
6 ноя 11, 04:22    [11554204]     Ответить | Цитировать Сообщить модератору
 Re: Построение XML-дерева при самообъединении таблицы  [new]
V-kont
Member

Откуда:
Сообщений: 7
Mnior
Т.е. не откладывайте вынос работы с XML из БД до момента когда до вас допрёт эта истина, сделайте это прямо сейчас.


Угу, а можете посоветовать какие-то решения?
10 ноя 11, 17:40    [11577247]     Ответить | Цитировать Сообщить модератору
 Re: Построение XML-дерева при самообъединении таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
V-kont
Угу, а можете посоветовать какие-то решения?
Вот так прочитать мысли и из десятков вариантов выбрать - "Возьмите это, сэр"
Какой у вас клиент, на чём у вас клиент, и каков основной смысл системы / решаемой задачи.

Можно воспользоваться, например:
А) SQLXMLOLEDB провайдер поставляется из коробки (и вообще весь комплекс - SQLXML 4.0)
Б) нативно генерировать XML, прямиком (XmlWriter и подобные ... гибкий для таких извращений) или косвенно (сериализация), на вашем языке
В) Преобразования, аля XSLT (только для мелких объёмов, клиентских)

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

Если нужно поставлять некоторому клиенту, так пусть непосредственно сервер-приложения и делает эту работу, притом на уровне непосредственного соединения с этим клиентом.

Но! Если надо поставлять / экспортировать данные (файлы) в таком формате, то:
1. Какого фига данные представляются в ерархической структуре?! С потолка или потребитель "хитрый"? Это я к вопросу:
V-kont
Кто-нибудь уже сталкивался с необходимостью построения XML-дерева в подобной ситуации?
Довольно специфичный формат.

2. Не надо боятся написать свой преобразователь. "Ещё одна прога" ничем не хуже "ещё одна процедура". Да на крайняк, если задачка разовая и редкая, да хоть в CLR можно запихнуть.

Но "послать подальше" предпочтительней. Задрали чукотские ласапедисты, генераторы белого шума.
11 ноя 11, 00:45    [11578710]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить