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

Откуда:
Сообщений: 311
Хочу получить XML вида
<Root Attr="AAA">
  <Data val="1" />
  <Data val="2" />
  <Data val="3" />
  <Data val="4" />
  <Data val="5" />
</Root>

Пытаюсь таким запросом:
declare @t table(val int)

insert into @t
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5

select (
  select cast((select 'AAA' as [@Attr] FOR XML PATH('Root')) as xml) as [node()]

  union all

  select cast((
    select [val] as [@val]
    from @t
    for xml path('Data')
  ) as xml) as [node()]

).query( '<Root>{/Root/@*,*[local-name() != "Root"]}</Root>' )
8 окт 09, 11:25    [7757496]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
daw
Member

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

?
select
   'AAA' as [Root/@Attr]
   , (select val [@val] from @t for xml path('Data'), type) as [Root/node()]
for xml path('')

Posted via ActualForum NNTP Server 1.4

8 окт 09, 11:32    [7757554]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
daw

?
select
   'AAA' as [Root/@Attr]
   , (select val [@val] from @t for xml path('Data'), type) as [Root/node()]
for xml path('')


Почти то что нужно. Вот только задачка посложней.
Более точный пример :
declare @t table(val int)

insert into @t
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5

declare @xml xml

set @xml = '<Root Attr="AAA"/>'

select @xml.query('<Root>{Root/@*}</Root>')
   , (select val [@val] from @t for xml path('Data'), type) as [Root/node()]
for xml path('')
8 окт 09, 11:57    [7757735]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
vino
Member

Откуда:
Сообщений: 1191
Greenhorn
Хочу получить XML вида
<Root Attr="AAA">
  <Data val="1" />
  <Data val="2" />
  <Data val="3" />
  <Data val="4" />
  <Data val="5" />
</Root>
daw ответил корректно
что же означает ваш пост
Greenhorn
...Вот только задачка посложней.
Более точный пример ...
?
8 окт 09, 13:14    [7758324]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
vino
Greenhorn
Хочу получить XML вида
<Root Attr="AAA">
  <Data val="1" />
  <Data val="2" />
  <Data val="3" />
  <Data val="4" />
  <Data val="5" />
</Root>
daw ответил корректно
что же означает ваш пост
Greenhorn
...Вот только задачка посложней.
Более точный пример ...
?


Что XML не собирается в уточненном примере
  select @xml.query('<Root>{Root/@*}</Root>') as [node()]
  ,cast((select val [@val] from @t for xml path('Data'), type) as xml) as [Root/node()]
  for xml path('')
------ выдает 
<Root Attr="AAA" />
<Root>
  <Data val="1" />
  <Data val="2" />
  <Data val="3" />
  <Data val="4" />
  <Data val="5" />
</Root>
---- А нужно
<Root Attr="AAA" >
  <Data val="1" />
  <Data val="2" />
  <Data val="3" />
  <Data val="4" />
  <Data val="5" />
</Root>

8 окт 09, 13:40    [7758535]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
daw
Member

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

> Почти то что нужно. Вот только задачка посложней.
> Более точный пример :

> set @xml ='<Root Attr="AAA"/>'

то есть Root у вас именно в готовом виде уже - без вариантов?
в запрос его получение не вставить?

ну, например, так:

select
   (
   select *
   from
   (select @xml [node()]
    union all
    select (select val [@val] from @t for xml path('Data'), type)
   ) t for xml path(''), type).query('<Root>{/Root/@*, Data}</Root>')


Posted via ActualForum NNTP Server 1.4

8 окт 09, 13:53    [7758643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
daw
Member

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

> Почти то что нужно. Вот только задачка посложней.
> Более точный пример :

> set @xml ='<Root Attr="AAA"/>'

то есть Root у вас именно в готовом виде уже - без вариантов?
в запрос его получение не вставить?

ну, например, так:

select
   (
   select *
   from
   (select @xml [node()]
    union all
    select (select val [@val] from @t for xml path('Data'), type)
   ) t for xml path(''), type).query('<Root>{/Root/@*, Data}</Root>')


Posted via ActualForum NNTP Server 1.4

8 окт 09, 13:53    [7758645]     Ответить | Цитировать Сообщить модератору
 Re: Помогите собрать XML  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
daw,
Огробное спасибо....
Я уже сам почти дошел до Вашего запроса, вот только type забыл добавить и получал
Msg 258, Level 15, State 1, Line 43
Cannot call methods on nvarchar(max).
8 окт 09, 14:03    [7758712]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить