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

Откуда: Novosibirsk
Сообщений: 1887
по просьбе товарища примерчик навскидку .Критика и предложения приветствуются.
declare @table table (id int,data xml)
insert into @table values(1,'<root><header id="1"><list><item i="1"></item><item i="2"></item></list></header></root>') 
,(2,'<root><header id="2"><list><item i="10"></item><item i="20"></item></list></header></root>')
,(3,'<root><header id="3"><list><item i="100"></item><item i="200"></item></list></header></root>')

select '0' as [header/@id]
,(select data.query('//item') as [*] from @table t for xml path(''),type) as [list]
for xml path(''),root('root')
6 ноя 14, 07:42    [16804143]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML из нескольких с объединением списка  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Критика и предложения чего? Оптимально ли это будет работать на Марсе?
6 ноя 14, 13:45    [16805934]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML из нескольких с объединением списка  [new]
Сон Веры Павловны
Member

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

Относительно структуры объединяемых кусков:
<root>
  <header id="1">
    <list>
      <item i="1"></item>
      <item i="2"></item>
    </list>
  </header>
</root>

решение некорректно:
<root>
  <header id="0" />
  <list>
    <item i="1" />
    <item i="2" />
    <item i="10" />
    <item i="20" />
    <item i="100" />
    <item i="200" />
  </list>
</root>

- тэг header не является родительским для list.
Можно сделать вот так:
declare
  @xdata xml;
select @xdata=(
  select (
    select (
      select (
        select data.query('//item') as [*] from @table t for xml path(''),type
      ) as [list]
      for xml path(''), root('header'), type
    ) as [header]
  ) for xml path(''), root, type
);
set @xdata.modify('insert attribute id {"0"} into (/root/header)[1]');

но как-то это не особенно интересно.
6 ноя 14, 14:39    [16806346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить