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

Откуда:
Сообщений: 5
Добрый день!
При формировании xml возникла проблема. Необходимо сформировать xml файл вот такой структуры:
<?xml version="1.0" encoding="WINDOWS-1251" ?> 
- <DEPARTAMENTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <REPORTS_DATE>
  <REPORT_INIT_DATE>2014-01-01</REPORT_INIT_DATE> 
  <REPORT_FINAL_DATE>2014-01-31</REPORT_FINAL_DATE> 
  </REPORTS_DATE>
- <DEPARTAMENT>
  <DEP_CCD>08f629ab-35b2-11e0-9d0b-1cc1dee8c2de</DEP_CCD> 
  <PARENT_CCD>08f629ab-35b2-11e0-9d0b-1cc1dee8c2de</PARENT_CCD> 
  <DEP_SHORT_NAME>Пример ОАО</DEP_SHORT_NAME> 
  <DEP_NAME>Открытое акционерное общество "Пример"</DEP_NAME> 
  <SYSMOMENT>2014-10-21 15:23:08</SYSMOMENT> 
  </DEPARTAMENT>
- <DEPARTAMENT>
  <DEP_CCD>a2c4dd3d-3993-11e0-8c26-1cc1dee8c2de</DEP_CCD> 
  <PARENT_CCD>08f629ab-35b2-11e0-9d0b-1cc1dee8c2de</PARENT_CCD> 
  <DEP_SHORT_NAME>Отдел режима</DEP_SHORT_NAME> 
  <DEP_NAME>Отдел режима</DEP_NAME> 
- <VACANCY>
  <POSITION>Заместитель начальника отдела</POSITION> 
  <VACANCY_COUNT>1.000</VACANCY_COUNT> 
  <MAX_SALARY>50100.35</MAX_SALARY> 
  </VACANCY>
- <VACANCY>
  <POSITION>Начальник отдела</POSITION> 
  <VACANCY_COUNT>1.000</VACANCY_COUNT> 
  <MAX_SALARY>70140.20</MAX_SALARY> 
  </VACANCY>
  <SYSMOMENT>2014-10-21 15:23:08</SYSMOMENT> 
  </DEPARTAMENT>
- <DEPARTAMENT>



Вот мой код для формирования данного файла:
select '<REPORTS_DATE>' as REPORTS_DATE,
         '<REPORT_INIT_DATE>'+'20150101'+'</REPORT_INIT_DATE>' as REPORT_INIT_DATE,
         '<REPORT_FINAL_DATE>'+'20150531'+'<REPORT_FINAL_DATE>' as REPORT_FINAL_DATE,
	 '</REPORTS_DATE>' as REPORTS_DATE1,
	 '<DEPARTAMENT>' as DEPARTAMENT,
         '<DEP_CCD>'+ convert(varchar(10),structs.struct_code) +'</DEP_CCD>' as DEP_CCD,
         '<PARENT_CCD>'+ convert(varchar(10),structs.struct_parent) +'</PARENT_CCD>' as PARENT_CCD,
         '<DEP_SHORT_NAME>'+ structs.short_name +'</DEP_SHORT_NAME>' as DEP_SHORT_NAME,
	 '<DEP_NAME>'+ structs.struct_name +'<DEP_NAME>' as DEP_NAME,
	 '<SYSMOMENT>'+ convert(varchar(10),getdate(),104) +'</SYSMOMENT>' as SYSMOMENT,
	 '<VACANCY>' as VACANCY,
	 '<POSITION>'+ appointments.name_appoint +'</POSITION>' as POSITION,
	 '<VACANCY_COUNT>'+ convert(varchar(10),partial) +'</VACANCY_COUNT>' as VACANCY_COUNT,
         '<MAX_SALARY>'+ convert(varchar(30),prvw_cells.wage) +'</MAX_SALARY>' as MAX_SALARY,
	 '</VACANCY>' as VACANCY1,
	 '<SYSMOMENT>'+ convert(varchar(10),getdate(),104) +'</SYSMOMENT>' as SYSMOMENT1
from  structs left outer join prvw_cells on prvw_cells.code_struct_name = structs.struct_code
              inner join appointments on prvw_cells.code_appoint = appointments.code_appoint
where prvw_cells.Date_Out >= '20150501' 
  and prvw_cells.id_firm = 1
  and Flag_deleted != 1
  and d_to >= getdate()
order by struct_name, name_appoint
for xml auto

Вот, примерно, что получается на выходе:

<DEPARTAMENTS> 
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>9</DEP_CCD>
<PARENT_CCD>118</PARENT_CCD>
<DEP_NAME>АВТОВЕСЫ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Весовщик</POSITION>
<VACANCY_COUNT>2.0000</VACANCY_COUNT>
<MAX_SALARY>15400.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<DEPARTAMENTS> <REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE><DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Ведущий специалист</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>32500.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<DEPARTAMENTS> <REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE><DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Кладовщик                </POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>18500.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<DEPARTAMENTS> <REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE><DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY><POSITION>Начальник отдела</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>53000.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>



Интересует вопрос можно ли сделать иерархический вывод данного файла вида:
<DEPARTAMENTS> 
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>9</DEP_CCD>
<PARENT_CCD>118</PARENT_CCD>
<DEP_NAME>АВТОВЕСЫ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Весовщик</POSITION>
<VACANCY_COUNT>2.0000</VACANCY_COUNT>
<MAX_SALARY>15400.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<DEPARTAMENTS> <REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531<REPORT_FINAL_DATE>
</REPORTS_DATE><DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ<DEP_NAME>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Ведущий специалист</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>32500.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY>
<POSITION>Кладовщик                </POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>18500.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>
<VACANCY><POSITION>Начальник отдела</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>53000.0000</MAX_SALARY>
<SYSMOMENT>Jun 23 201</SYSMOMENT>


Сообщение было отредактировано: 24 июн 15, 01:01
23 июн 15, 16:10    [17807508]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Gviber
Member

Откуда:
Сообщений: 124
select 
	(select '20150101' as REPORT_INIT_DATE, '20150531' as REPORT_FINAL_DATE for xml raw('REPORTS_DATE'),elements,type),
	(
		select DEP_CCD, PARENT_CCD, DEP_SHORT_NAME, DEP_NAME ,GETDATE() SYSMOMENT ,POSITION , VACANCY_COUNT,MAX_SALARY
		from 
		(
			 select 1 id, '1' DEP_CCD, '2' PARENT_CCD, '3' DEP_SHORT_NAME, '4' DEP_NAME 
			 union all
			 select 2 id, '11' DEP_CCD, '12' PARENT_CCD, '13' DEP_SHORT_NAME, '14' DEP_NAME 
		) DEPARTAMENT
		left join 
		( 
			select 2 id ,'a' POSITION, 'b' VACANCY_COUNT, 'c' MAX_SALARY 
			union all
			select 2 id ,'a2' POSITION, 'b2' VACANCY_COUNT, 'c3' MAX_SALARY 
		) VACANCY
			on DEPARTAMENT.id=VACANCY.id
		for xml auto,elements,type
	)
for xml raw('DEPARTAMENTS'),elements
23 июн 15, 16:50    [17807736]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Evgeniy_Pshenin
Member

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

Спасибо, за ответ, но пользуясь данным скриптом получается вот такой результат:

<DEPARTAMENTS>
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>9</DEP_CCD>
<PARENT_CCD>118</PARENT_CCD>
<DEP_NAME>АВТОВЕСЫ</DEP_NAME>
<SYSMOMENT>2015-06-23T17:51:13.897</SYSMOMENT>
<POSITION>Весовщик</POSITION>
<VACANCY_COUNT>2.0000</VACANCY_COUNT>
<MAX_SALARY>15400.0000</MAX_SALARY>
</DEPARTAMENT>
</DEPARTAMENTS>
<DEPARTAMENTS>
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ</DEP_NAME>
<SYSMOMENT>2015-06-23T17:51:13.897</SYSMOMENT>
<POSITION>Ведущий специалист</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>32500.0000</MAX_SALARY>
</DEPARTAMENT>
</DEPARTAMENTS>
<DEPARTAMENTS>
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ</DEP_NAME>
<SYSMOMENT>2015-06-23T17:51:13.897</SYSMOMENT>
<POSITION>Кладовщик </POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>18500.0000</MAX_SALARY>
</DEPARTAMENT>
</DEPARTAMENTS>


А мне необходимо чтобы все должности подразделения выводились подряд, а не отдельным блоком:

<DEPARTAMENTS>
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>9</DEP_CCD>
<PARENT_CCD>118</PARENT_CCD>
<DEP_NAME>АВТОВЕСЫ</DEP_NAME>
<SYSMOMENT>2015-06-23T17:51:13.897</SYSMOMENT>
<POSITION>Весовщик</POSITION>
<VACANCY_COUNT>2.0000</VACANCY_COUNT>
<MAX_SALARY>15400.0000</MAX_SALARY>
</DEPARTAMENT>
</DEPARTAMENTS>
<DEPARTAMENTS>
<REPORTS_DATE>
<REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
<REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
</REPORTS_DATE>
<DEPARTAMENT>
<DEP_CCD>11</DEP_CCD>
<PARENT_CCD>350</PARENT_CCD>
<DEP_NAME>АДМИНИСТРАТИВНО-ХОЗЯЙСТВЕННЫЙ ОТДЕЛ</DEP_NAME>
<SYSMOMENT>2015-06-23T17:51:13.897</SYSMOMENT>
<POSITION>Ведущий специалист</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>32500.0000</MAX_SALARY>
<POSITION>Кладовщик </POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>18500.0000</MAX_SALARY>
<POSITION>Начальник отдела</POSITION>
<VACANCY_COUNT>1.0000</VACANCY_COUNT>
<MAX_SALARY>53000.0000</MAX_SALARY>
<POSITION>Оператор агрегата обработки отходов</POSITION>
<VACANCY_COUNT>3.0000</VACANCY_COUNT>
<MAX_SALARY>0.0000</MAX_SALARY>
</DEPARTAMENT>
</DEPARTAMENTS>
23 июн 15, 17:58    [17808101]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Gviber
Member

Откуда:
Сообщений: 124
Моим примером, получается такой результат:

<DEPARTAMENTS>
  <REPORTS_DATE>
    <REPORT_INIT_DATE>20150101</REPORT_INIT_DATE>
    <REPORT_FINAL_DATE>20150531</REPORT_FINAL_DATE>
  </REPORTS_DATE>
  <DEPARTAMENT>
    <DEP_CCD>1</DEP_CCD>
    <PARENT_CCD>2</PARENT_CCD>
    <DEP_SHORT_NAME>3</DEP_SHORT_NAME>
    <DEP_NAME>4</DEP_NAME>
    <SYSMOMENT>2015-06-23T18:06:26.170</SYSMOMENT>
    <VACANCY />
  </DEPARTAMENT>
  <DEPARTAMENT>
    <DEP_CCD>11</DEP_CCD>
    <PARENT_CCD>12</PARENT_CCD>
    <DEP_SHORT_NAME>13</DEP_SHORT_NAME>
    <DEP_NAME>14</DEP_NAME>
    <SYSMOMENT>2015-06-23T18:06:26.170</SYSMOMENT>
    <VACANCY>
      <POSITION>a</POSITION>
      <VACANCY_COUNT>b</VACANCY_COUNT>
      <MAX_SALARY>c</MAX_SALARY>
    </VACANCY>
    <VACANCY>
      <POSITION>a2</POSITION>
      <VACANCY_COUNT>b2</VACANCY_COUNT>
      <MAX_SALARY>c3</MAX_SALARY>
    </VACANCY>
  </DEPARTAMENT>
</DEPARTAMENTS>


DEPARTAMENTS только один раз должен быть.
23 июн 15, 18:08    [17808137]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Evgeniy_Pshenin
Member

Откуда:
Сообщений: 5
Может я что-то не так пишу?

select
(select '20150101' as REPORT_INIT_DATE, '20150531' as REPORT_FINAL_DATE for xml raw('REPORTS_DATE'),elements,type),
(
select distinct DEP_CCD,
PARENT_CCD,
DEP_SHORT_NAME,
DEP_NAME,
GETDATE() SYSMOMENT,
POSITION,
VACANCY_COUNT,
MAX_SALARY
from
(
select 1 id, structs.struct_code DEP_CCD, structs.struct_parent PARENT_CCD, structs.short_name DEP_SHORT_NAME, structs.struct_name DEP_NAME
union all
select 2 id, structs.struct_code DEP_CCD, structs.struct_parent PARENT_CCD, structs.short_name DEP_SHORT_NAME, structs.struct_name DEP_NAME
) DEPARTAMENT
left join
(
select 1 id ,appointments.name_appoint POSITION, prvw_cells.partial VACANCY_COUNT, prvw_cells.wage MAX_SALARY
union all
select 2 id ,appointments.name_appoint POSITION, prvw_cells.partial VACANCY_COUNT, prvw_cells.wage MAX_SALARY
) VACANCY
on DEPARTAMENT.id=VACANCY.id

for xml auto,elements,type
)
from structs left outer join prvw_cells on prvw_cells.code_struct_name = structs.struct_code
inner join appointments on prvw_cells.code_appoint = appointments.code_appoint
where prvw_cells.Date_Out >= '20150501'
and prvw_cells.id_firm = 1
and Flag_deleted != 1
and d_to >= '20150531'
for xml raw('DEPARTAMENTS'),elements
23 июн 15, 18:59    [17808301]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Gviber
Member

Откуда:
Сообщений: 124
from structs left outer join prvw_cells on prvw_cells.code_struct_name = structs.struct_code
 inner join appointments on prvw_cells.code_appoint = appointments.code_appoint
where prvw_cells.Date_Out >= '20150501' 
 and prvw_cells.id_firm = 1
 and Flag_deleted != 1
 and d_to >= '20150531'


вот это должно быть раскидано в блоках DEPARTAMENT, VACANCY. Вам нужно только сделать изменения внтури () DEPARTAMENT, () VACANCY + оставить названия столбцов.

Никаких union all быть не должно, они для примера.
23 июн 15, 19:17    [17808342]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML файла  [new]
Evgeniy_Pshenin
Member

Откуда:
Сообщений: 5
Спасибо, разобрался, все заработало.
24 июн 15, 09:33    [17809598]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить