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

Откуда:
Сообщений: 103
Добрый день.

Подскажите, пожалуйста, как из таблицы вида
some_idsome_data
1A
1B
1C
2D
2E
3F
3G
3H
ж
получить
<root>
  <row some_id=1>
    <some_data>A</some_data>
    <some_data>B</some_data>
    <some_data>C</some_data>
  </row>
  <row some_id=2>
    <some_data>D</some_data>
    <some_data>E</some_data>
  </row>
  <row some_id=3>
    <some_data>F</some_data>
    <some_data>G</some_data>
    <some_data>H</some_data>
  </row>
</root>


Делаю пока так
WITH T AS (
	SELECT 1 SOME_ID, 'A' SOME_DATA UNION
	SELECT 1 SOME_ID, 'B' SOME_DATA UNION
	SELECT 1 SOME_ID, 'C' SOME_DATA UNION
	SELECT 2 SOME_ID, 'D' SOME_DATA UNION
	SELECT 2 SOME_ID, 'E' SOME_DATA UNION
	SELECT 3 SOME_ID, 'F' SOME_DATA UNION
	SELECT 3 SOME_ID, 'G' SOME_DATA UNION
	SELECT 3 SOME_ID, 'H' SOME_DATA 
)

SELECT CAST([ROOT] AS XML)
FROM (
	SELECT DISTINCT 
		'<row some_id="' + CAST(T1.SOME_ID AS CHAR(1)) + '">' + 
		(
			SELECT T2.SOME_DATA 
			FROM T T2
			WHERE T1.SOME_ID = T2.SOME_ID
			ORDER BY T2.SOME_ID 
			FOR XML PATH('')
		) +
		'</row>' [ROOT]
	FROM T T1
	) TT
FOR XML PATH('root')

но мне кажется это некрасивым.
9 июн 12, 16:38    [12695042]     Ответить | Цитировать Сообщить модератору
 Re: for xml  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
может что-нибудь дальше сами придумаете.

declare @t table(id int, value varchar(1))

insert into @t (id, value)
	SELECT 1 SOME_ID, 'A' SOME_DATA UNION
	SELECT 1 SOME_ID, 'B' SOME_DATA UNION
	SELECT 1 SOME_ID, 'C' SOME_DATA UNION
	SELECT 2 SOME_ID, 'D' SOME_DATA UNION
	SELECT 2 SOME_ID, 'E' SOME_DATA UNION
	SELECT 3 SOME_ID, 'F' SOME_DATA UNION
	SELECT 3 SOME_ID, 'G' SOME_DATA UNION
	SELECT 3 SOME_ID, 'H' SOME_DATA 


select 
	1		as Tag,
	0	as Parent,
	T.id	as [row!1!ID],
	NULL	as [data!2!!ELEMENT]
from @t T
where T.id = 1
GROUP BY T.id
UNION ALL
select 
	2 as Tag,  	 
	1 as Parent,
	A.id,
	A.value
from @t A where A.id = 1
FOR XML EXPLICIT, ROOT('root')
9 июн 12, 17:13    [12695239]     Ответить | Цитировать Сообщить модератору
 Re: for xml  [new]
Ejhi
Member

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

Спасибо, но я не пойму, как выгрузить все данные вашим способом. Обходить все some_id курсором не вариант.
9 июн 12, 17:45    [12695373]     Ответить | Цитировать Сообщить модератору
 Re: for xml  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Спасибо, но я не пойму, как выгрузить все данные вашим способом.

убрать where - не? ну, и отсортировать правильно.

select 
	1		as Tag,
	0	as Parent,
	T.id	as [row!1!ID],
	NULL	as [data!2]
from @t T
GROUP BY T.id
UNION ALL
select 
	2 as Tag,  	 
	1 as Parent,
	A.id,
	A.value
from @t A 
order by [row!1!ID], Tag
FOR XML EXPLICIT, ROOT('root')
9 июн 12, 19:07    [12695562]     Ответить | Цитировать Сообщить модератору
 Re: for xml  [new]
Ejhi
Member

Откуда:
Сообщений: 103
Всем спасибо за ответы.
27 июн 12, 12:31    [12781831]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить