T SQL: возвращать элементы группы как XML - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь объединить значения для группы в один XML. Я на SQL Server 2016.

Мои необработанные данные выглядят следующим образом (здесь мы строго ограничены проблемой. Мои реальные значения не являются обобщенными c.):

create table #data (group_id int, value1 char(10), value2 char(10), value3 char(10));

insert #data values 
(1,'a1', 'b1', 'c1'),
(1,'a2', 'b2', 'c2'),
(1,'a3', 'b3', 'c3'),
(2,'a4', 'b4', 'c4');

Я ищу агрегатную функцию, которая бы возвращала одну XML (на группу)

select 
  group_id,
  **my_XML_aggregation** as [XML-values]
from #data
group by group_id

Ожидаемый результат XML для первой группы (group_id = 1) должен выглядеть (имена элементы не имеют отношения к проблеме)

<group>
   <row>
     <value1>a1<value1>
     <value2>b1<value1>
     <value3>c1<value1>
  </row>
   <row>
     <value1>a2<value1>
     <value2>b2<value1>
     <value3>c2<value1>
  </row>
   <row>
     <value1>a3<value1>
     <value2>b3<value1>
     <value3>c3<value1>
  </row>
</group>

Я знаю, как агрегировать разделенную шаблоном строку. Это не сделало бы работу. Даже поместить агрегированную по шаблону строку в один элемент XML нет альтернативы. Я ищу структурированную информацию в XML.

1 Ответ

3 голосов
/ 19 марта 2020

Попробуйте так:

drop table if exists #data ;

create table #data (group_id int, value1 varchar(10), value2 varchar(10), value3 varchar(10));

insert #data values 
(1,'a1', 'b1', 'c1'),
(1,'a2', 'b2', 'c2'),
(1,'a3', 'b3', 'c3'),
(2,'a4', 'b4', 'c4');

with groups as
(
  select distinct group_id from #data 
)
select group_id,
       (
         select value1, value2, value3
         from #data
         where group_id = groups.group_id
         for xml path, root('group'), type
       ) group_doc
from groups 

выходы

group_id    group_doc
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           <group><row><value1>a1</value1><value2>b1</value2><value3>c1</value3></row><row><value1>a2</value1><value2>b2</value2><value3>c2</value3></row><row><value1>a3</value1><value2>b3</value2><value3>c3</value3></row></group>
2           <group><row><value1>a4</value1><value2>b4</value2><value3>c4</value3></row></group>
...