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

снова хочу просветится в xml-ях :)

---------
есть такие 3-и таблички

Firma
namecompanyurl
FirmaOOO Firmahttp://firma.org


Groups
idparent_idname
1NULLGroup1
2NULLGroup2
32Group3
43Group4
52Group5
65Group6


Items
idgroup_idnamepriceurl
14Item110.00http://firma.org/Item1.html
24Item220.00http://firma.org/Item2.html
35Item330.00http://firma.org/Item3.html
44Item440.00http://firma.org/Item4.html
55Item550.00http://firma.org/Item5.html
65Item660.00http://firma.org/Item6.html

можно ли, на этих данных, сгенерировать такой xml одним запросом/процедурой ?
+ результир.xml

<shop> 
<name>Firma</name> 
<company>OOO Firma</company>
<url>http://firma.org</url>
<categories>
  <category id="1">Group1</category>
  <category id="2">Group2</category>
  <category id="3" parentId="2">Group3</category>
  <category id="4" parentId="3">Group4</category>
  <category id="5" parentId="2">Group5</category>
  <category id="6" parentId="5">Group6</category>
</categories>
<offers>
  <offer id="1">
    <url>http://firma.org/Item1.html</url>
    <price>10.00</price>
    <categoryId>4</categoryId>
    <name>Item1</name>
  </offer>
  <offer id="2">
    <url>http://firma.org/Item2.html</url>
    <price>20.00</price>
    <categoryId>4</categoryId>
    <name>Item2</name>
  </offer>
  <offer id="3">
    <url>http://firma.org/Item3.html</url>
    <price>30.00</price>
    <categoryId>5</categoryId>
    <name>Item3</name>
  </offer>
  <offer id="4">
    <url>http://firma.org/Item4.html</url>
    <price>40.00</price>
    <categoryId>4</categoryId>
    <name>Item4</name>
  </offer>
  <offer id="5">
    <url>http://firma.org/Item5.html</url>
    <price>50.00</price>
    <categoryId>5</categoryId>
    <name>Item5</name>
  </offer>
  <offer id="6">
    <url>http://firma.org/Item6.html</url>
    <price>60.00</price>
    <categoryId>5</categoryId>
    <name>Item6</name>
  </offer>
</offers>
</shop>

т.е. - элементы <categories> (группы - Groups) и <offers> (элементы групп - Items) - сами являются "xml-полями" "внешнего xml" <shop>
----------

сейчас получаю эти <categories> и <offers> - отдельно, и "допиливаю" к ним всё остальное на клиенте
+ xml-и "по отдельности"
select	
		1 AS Tag,
		null AS Parent,

      	null [categories!1!desc],
		null as [category!2!id],
		null as [category!2!parentId],
		null as [category!2!!ELEMENT]
		
union all

select 
		2 AS Tag,
		1 AS Parent,

		null,
		id,
		parent_id,
		name
	
from @Groups

for xml explicit
---------

select 
		1 AS Tag,
		null AS Parent,
		
      	null [offers!1!desc],
		null as [offer!2!id],
		null as [offer!2!url!ELEMENT],
		null as [offer!2!price!ELEMENT],
		null as [offer!2!categoryId!ELEMENT],
		null as [offer!2!name!ELEMENT]

union all

select 
		2 AS Tag,
		1 AS Parent,
		
		null,
		id,
		url,
		price,
		group_id,
		name
		
from @Items

for xml explicit

но, "крайне" хотелось бы, "освободить" клиент от "допиливания", что бы он получал уже полностью валидный хмл, и только сохранял его в файл

спасибо !

+ исходные данные

---- Firma
declare @Firma table (name varchar(20), company varchar(20), url varchar(100))

insert into @Firma 
select 'Firma', 'OOO Firma', 'http://firma.org'

---- Groups
declare @Groups table (id int, parent_id int, name varchar(20)) 

insert into @Groups

select 1, null, 'Group1' union all
select 2, null, 'Group2' union all
select 3, 2, 'Group3' union all
select 4, 3, 'Group4' union all
select 5, 2, 'Group5' union all
select 6, 5, 'Group6'

---- Items
declare @Items table (id int, group_id int, name varchar(20), price decimal(18,2), url varchar(100)) 

insert into @Items

select 1, 4, 'Item1', 10.0, 'http://firma.org/Item1.html' union all
select 2, 4, 'Item2', 20.0, 'http://firma.org/Item2.html' union all
select 3, 5, 'Item3', 30.0, 'http://firma.org/Item3.html' union all
select 4, 4, 'Item4', 40.0, 'http://firma.org/Item4.html' union all
select 5, 5, 'Item5', 50.0, 'http://firma.org/Item5.html' union all
select 6, 5, 'Item6', 60.0, 'http://firma.org/Item6.html'

--------------
--select * from @Firma

--select * from @Groups

--select * from @Items


зы
желательно, что бы эта "генерация" могла работать и в MS SQL 2000,
но, накрайняк - сойдёт и для 2005-го... :)
11 апр 12, 15:32    [12400224]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
ъ
Guest
ъ
т.е. - элементы <categories> (группы - Groups) и <offers> (элементы групп - Items) - сами являются "xml-полями" "внешнего xml" <shop>

вот это имелось в виду )

К сообщению приложен файл. Размер - 63Kb
11 апр 12, 15:34    [12400255]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ну и объедините их все в один запрос union-ами.
вроде, проблем-то никаких. Tag да Parent расставить.
первым запросом будут данные из @Firma и Tag, Parent - 1, null
во втором запросе будет 2, 1 и 3, 2, а в третьем 4, 1 и 5, 4.
ну да - в каждый запрос надо столбцы из других добавить.
в данном случае просто с null-ами.
и order by Tag в конце.

Posted via ActualForum NNTP Server 1.5

11 апр 12, 15:59    [12400480]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
ъ
Guest
daw,

спасибо !
не уверен, что я сделал всё в точности, как Вы написали,
но получилось то что нужно :)
+
-- 1
select 
		1		AS Tag,
		null		AS Parent,

		name		as [shop!1!name!ELEMENT],      	
		company		as [shop!1!company!ELEMENT],      	
		url		as [shop!1!url!ELEMENT],

		null		as [categories!2!ELEMENT],
		null		as [category!3!id],
		null		as [category!3!parentId],
		null		as [category!3!!ELEMENT],

		null		as [offers!4!ELEMENT],
		null		as [offer!5!id],
		null		as [offer!5!url!ELEMENT],
		null		as [offer!5!price!ELEMENT],
		null		as [offer!5!categoryId!ELEMENT],
		null		as [offer!5!name!ELEMENT]
		

from 	@Firma	  

union all

-- 2
select 
		2 AS Tag,
		1 AS Parent,

		null,
		null,
		null,
		
		null,
		null, 
		null, 
		null,
		
		null,
		null,
		null, 
		null, 
		null,
		null

union all

-- 3
select
		3 AS Tag,
		2 AS Parent,

		null,
		null,
		null,
		
		null,
		id, 
		parent_id, 
		name,
		
		null,
		null,
		null,
		null,
		null,
		null
		
from	@Groups		
    	
union all

-- 4
select 
		4 AS Tag,
		1 AS Parent,

		null,
		null,
		null,
		
		null,
		null, 
		null, 
		null,
		
		null,
		null,
		null,
		null,
		null,
		null
				
union all

-- 5
select
		5 AS Tag,
		4 AS Parent,

		null,
		null,
		null,
		
		null,
		null, 
		null, 
		null,
		
		null,
		id,
		url,
		price,
		group_id,
		name		
		
from	@Items	    	
    					
for xml explicit

скажите, а вот эти 2-а UNION-а, полностью из NULL-ов (2-ой и 4-ый - я их выделил) - это "нормально" ?
так и было задуманно ?
то, что Вы описывали - то же так бы выглядело ?
11 апр 12, 17:49    [12401298]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
ъ
Guest
ъ
скажите, а вот эти 2-а UNION-а, полностью из NULL-ов (2-ой и 4-ый - я их выделил) - это "нормально" ?
так и было задуманно ?
то, что Вы описывали - то же так бы выглядело ?

гм,
вроде дошло :), - в моих "xml-и "по отдельности" - то же самое, - в каждом есть такой select из null-ов ...

т.е. - именно, - просто "объеденить и Tag да Parent расставить"

daw, ещё раз - спасибо !
11 апр 12, 18:03    [12401397]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
dimong2004
Member

Откуда:
Сообщений: 173
К стати, моё бодание с explicit, натолкнуло меня на такое решение:


select id,reg_date,
cast((Select name,amount,price from order_items where order_id=orders.id for xml auto) as xml
cast((Select payer,account_no,summa from payments where order_id=orders.id for xml auto) as xml
from orders for xml auto

(Это просто пример. Не реальные таблицы)

Каждый может проверить. Реально работает.
24 апр 12, 13:58    [12462837]     Ответить | Цитировать Сообщить модератору
 Re: XML с "xml-элементами"  [new]
dimong2004
Member

Откуда:
Сообщений: 173
dimong2004,

упс! Скобочки не закрыл
24 апр 12, 13:59    [12462845]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить