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

Откуда:
Сообщений: 2808
Хочу сформировать такой XML:
<msg id="1">
  <row lang="ru" msg="Пользователь=[1] не играет в игре id=[2]">
    <param>Вася</param>
  </row>
  <row lang="en" msg="User name=[1] does not play in the game id=[2]">
    <param>Vasa</param>
    <param>7777</param>
  </row>
</msg>

<msg id="2">
  <row lang="ru" msg="Ошибка" />
  <row lang="en" msg="Error" />
</msg>

из таких данных:
id	lang	msg	param
1 en User name=[1] does not play in the game id=[2] Vasa
1 en User name=[1] does not play in the game id=[2] 7777
1 ru Пользователь=[1] не играет в игре id=[2] Вася
2 ru Ошибка NULL
2 en Error NULL
Т.е. первый тег msg с аттрибутом id, далее вложенный row, в row аттрибут lang, ну и параметры уже как элементы вложенные в 3й уровень... Читаю БОЛ с эксплисит... нифига не получается. Подскажите или запрос как корректно нарисовать или какую то документацию понятную на примерах?
+ запрос такой...
if object_id('tempdb..#t') is not null drop table #t
select
	 m.*
	,p.param
into #t
from
(
	values
	 (1,'en','User name=[1] does not play in the game id=[2]')
	,(1,'ru','Пользователь=[1] не играет в игре id=[2]')
	,(2,'ru','Ошибка')
	,(2,'en','Error')
) m(id,lang,msg)
left join
(
	values
	 (1,'en','Vasa')
	,(1,'en','7777')
	,(1,'ru','Вася')
) p(id, lang, param)
	on m.id = p.id
	and m.lang = p.lang


select distinct
	 1 as Tag
	,null as Parent
	,id as [msg!1!id]
	,null as [msg!2!row!element]
	,lang as [msg!2!lang]
	,msg as [msg!2!msg]
	,param as [msg!3!param!element]
from #t
union all
select distinct
	 2 as Tag
	,1 as Parent
	,null
	,id
	,lang
	,msg
	,param
from #t
union all
select distinct
	 3 as Tag
	,2 as Parent
	,id
	,null
	,lang
	,msg
	,param
from #t
for xml explicit

declare @x xml = '
<msg id="1">
	<row lang="ru" msg="Пользователь=[1] не играет в игре id=[2]">
		<param>Вася</param>
	</row>
	<row lang="en" msg="User name=[1] does not play in the game id=[2]">
		<param>Vasa</param>
		<param>7777</param>
	</row>
</msg>
<msg id="2">
	<row lang="ru" msg="Ошибка" />
	<row lang="en" msg="Error" />
</msg>'
select @x
9 июл 18, 15:49    [21556705]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с xml explicit  [new]
invm
Member

Откуда: Москва
Сообщений: 9279
declare @t table (id int, lang varchar(10), msg varchar(100), param varchar(100));

insert into @t
values
(1, 'en', 'User name=[1] does not play in the game id=[2]', 'Vasa'),
(1, 'en', 'User name=[1] does not play in the game id=[2]', '7777'),
(1, 'ru', 'Пользователь=[1] не играет в игре id=[2]', 'Вася'),
(2, 'ru', 'Ошибка', NULL),
(2, 'en', 'Error', NULL);

select
 a.id as [@id], d.x as [*]
from
 (select distinct id from @t) a cross apply
 (
  select
   lang as [@lang], msg as [@msg], c.x as [*]
  from
   (select distinct lang, msg from @t where id = a.id) b cross apply
   (select param from @t where id = a.id and lang = b.lang and msg = b.msg for xml path(''), type) c(x)
  for xml path('row'), type
 ) d(x)
for xml path('msg'), type;
9 июл 18, 16:23    [21556838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с xml explicit  [new]
Дед-Папыхтет
Member [заблокирован]

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

Спасибо большое...
9 июл 18, 16:35    [21556877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить