powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка строк из xml-файла
3 сообщений из 3, страница 1 из 1
Выборка строк из xml-файла
    #39710904
mosxe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Последние пару дней никак не могу решить одну ситуацию: Есть xml-файл
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
<education_plan >
  <name>test</name>
  <group_id>6575029309690231440</group_id>
  <compound_program_id>6496048125887279509</compound_program_id>
  <person_id>6584698427624525408</person_id>
  <person_fullname>Алексеев Кирилл Владимирович</person_fullname>
  <person_position_id>6584695855826419753</person_position_id>
  <person_position_name>Разработчик</person_position_name>
  <person_position_code>DA815ACF8A53D7E44ADCB938382458CA</person_position_code>
  <person_org_id>2423575132271016192</person_org_id>
  <person_org_name>MERLION</person_org_name>
  <person_subdivision_id>6040091575323209548</person_subdivision_id>
  <person_subdivision_name>Группа дистанционного обучения</person_subdivision_name>
  <person_subdivision_code>000198</person_subdivision_code>
  <person_code>45667</person_code>
  <create_date>2018-09-13T13:23:00Z</create_date>
  <finish_date>2018-09-13T13:23:00Z</finish_date>
  <plan_date>2018-09-13T13:23:00Z</plan_date>
  <state_id>0</state_id>
  <programs>
    <program>
      <id>5959071437000156305</id>
      <name>Тестовая учебная программа (не назначать)</name>
      <education_method_id>6575034627839454629</education_method_id>
      <type>education_method</type>
      <object_id>6576969200213636977</object_id>
      <object_name>Тестовая учебная программа (не назначать)</object_name>
      <object_start_date>2018-07-11T09:00:00Z</object_start_date>
      <create_date>2018-09-13T13:23:00Z</create_date>
      <plan_date>2018-09-20T00:00:00Z</plan_date>
      <result_type>event_result</result_type>
      <state_id>1</state_id>
      <readiness_percent>90</readiness_percent>
    </program>
    <program>
      <id>25928031</id>
      <name>Планирование, организация и контроль</name>
      <type>assessment</type>
      <object_id>6015396206078217355</object_id>
      <create_date>2018-09-13T13:23:00Z</create_date>
      <plan_date>2018-09-30T00:00:00Z</plan_date>
      <result_type>active_learning</result_type>
      <state_id>4</state_id>
      <readiness_percent>80</readiness_percent>
      <completed_parent_programs>
        <completed_parent_program>
          <program_id>5959071437000156305</program_id>
        </completed_parent_program>
      </completed_parent_programs>
    </program>
    <program>
      <id>6078856089697798669</id>
      <name>Координация работы сотрудников</name>
      <education_method_id>6078856089697798669</education_method_id>
      <type>education_method</type>
      <object_id>6405499774486846705</object_id>
      <object_name>Вебинар 'Координация работы сотрудников'</object_name>
      <object_code>CITILINK</object_code>
      <object_start_date>2017-06-16T11:00:23Z</object_start_date>
      <create_date>2018-09-13T13:23:00Z</create_date>
      <plan_date>2018-11-30T00:00:00Z</plan_date>
      <result_type>active_learning</result_type>
      <state_id>0</state_id>
    </program>
    <program>
      <id>21427088</id>
      <name>Координация работы сотрудников</name>
      <type>assessment</type>
      <object_id>6328243748511244692</object_id>
      <create_date>2018-09-13T13:23:00Z</create_date>
      <result_type>active_learning</result_type>
      <result_object_id>6605120038882207089</result_object_id>
      <state_id>0</state_id>
      <completed_parent_programs>
        <completed_parent_program>
          <program_id>5959071437000156305</program_id>
        </completed_parent_program>
        <completed_parent_program>
          <program_id>6078856661787743881</program_id>
        </completed_parent_program>
      </completed_parent_programs>
    </program>
    <program>
      <id>6078856661787743881</id>
      <name>Мотивация и развитие сотрудников</name>
      <education_method_id>6078856661787743881</education_method_id>
      <type>education_method</type>
      <object_name>Мотивация и развитие сотрудников</object_name>
      <object_start_date>2018-09-13T09:00:00Z</object_start_date>
      <create_date>2018-09-13T13:23:00Z</create_date>
      <result_type>active_learning</result_type>
      <state_id>0</state_id>
    </program>
</education_plan>


Нужно из этого файла выбрать "программы", которые имеют вложенную так скажем "программу" - <completed_parent_program>
Делается это довольно легко:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	SELECT 
		T2.Loc.query('.').value('(/program/id)[1]', 'nvarchar(100)') as id_event
		,T2.Loc.query('.').value('(/program/name)[1]', 'nvarchar(100)') as name_event
	FROM [WTDB].[dbo].education_plans as eds
	INNER JOIN [WTDB].[dbo].education_plan as edu
	CROSS APPLY data.nodes('/education_plan/programs/program') as T2(Loc)
		on  edu.id = eds.id 
	WHERE edu.id = 6600652548845478134 and T2.Loc.query('.').value('(/program/completed_parent_programs/completed_parent_program/program_id)[1]', 'nvarchar(100)') IS NOT NULL


Получилось две "программы", которые имеют вложенные "программы" - completed_parent_program.
И дальше мне нужно получить вот такую таблицу:
id name id_program name_programm state_id_program25928031 Планирование организация и контроль 5959071437000156305 Тестовая учебная программа (не назначать) 121427088Координация работы сотрудников 5959071437000156305 Тестовая учебная программа (не назначать) 121427088Координация работы сотрудников 6078856661787743881 Мотивация и развитие сотрудников 0

Мне по идеи нужна какая-то рекурсия, чтобы я смог пройтись по родителям и вывести всех их детей. Если бы изначально были обычные таблицы, проблем бы не было, но т.к. все данные хранятся в xml-файле я не знаю как можно по ним пройтись и связать между ними.
Возможно кто-то хотя бы мысль подкинет в каком лучше направлении двигаться.
Заранее спасибо.
...
Рейтинг: 0 / 0
Выборка строк из xml-файла
    #39710925
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
 p.n.value('id[1]', 'nvarchar(100)'),
 p.n.value('name[1]', 'nvarchar(100)'),
 cpp.n.value('program_id[1]', 'nvarchar(100)')
from
[WTDB].[dbo].education_plans as eds
	INNER JOIN [WTDB].[dbo].education_plan as edu on edu.id = eds.id
	CROSS APPLY data.nodes('/education_plan/programs/program') p(n)
    cross apply p.n.nodes('completed_parent_programs/completed_parent_program') cpp(n)
where
 edu.id = 6600652548845478134
...
Рейтинг: 0 / 0
Выборка строк из xml-файла
    #39710932
mosxe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Человеческое спасибо !!!
Делается все просто, но из-за не знания убил столько времени...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка строк из xml-файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]