powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML.nodes().value() - как получить в содержимое узла как XML?
5 сообщений из 5, страница 1 из 1
XML.nodes().value() - как получить в содержимое узла как XML?
    #40085758
Serg Kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть несколько сущностей, представленные парой табличек вида (полей на самом деле больше:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @ParentTbl as table (ParentId int, Field1 varchar(30), Field2 varchar(30)) ;
declare @ChildTbl as table (ParentID int, ChildId int, ChildField1 varchar(30), ChildField2 varchar(30)) ;

insert into @ParentTbl (ParentId, Field1, Field2)
values (1, 'value1', 'value2')

insert into @ChildTbl (ParentId, ChildId, ChildField1, ChildField2)
values 
	(1, 2, 'childvalue1', 'childvalue2'),
	(1, 3, 'childvalue3', 'childvalue4')



Должен получиться такой XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<entity_type code="parent">
	<field code="ParentId">1</field>
	<field code="Field1">value1</field>
	<field code="Field2">value2</field>
	<entity_group code="childs">
		<entity_type code="child">
			<field code="ChildId">2</field>
			<field code="ChildField1">childvalue1</field>
			<field code="ChildField2">childvalue2</field>
		</entity_type>
		<entity_type code="child">
			<field code="ChildId">3</field>
			<field code="ChildField1">childvalue3</field>
			<field code="ChildField2">childvalue4</field>
		</entity_type>
	</entity_group>
</entity_type>



Можно конечно формировать вот так:
Код: sql
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.
select
	[@code] = 'parent',
	[Field/@code] = 'ParentId',
	[Field] = ParentId,
	'',	
	[Field/@code] = 'Field1',
	[Field] = Field1,
	'',
	[Field/@code] = 'Field2',
	[Field] = Field2,
	'',
	(
		select
			[@code] = 'childs',
			(
				select
					[@code] = 'child',
					[Field/@code] = 'ParentId',
					[Field] = ParentId,
					'',	
					[Field/@code] = 'ChildId',
					[Field] = ParentId,
					'',	
					[Field/@code] = 'ChildField1',
					[Field] = ChildField1,
					'',
					[Field/@code] = 'ChildField2',
					[Field] = ChildField2,
					''
				from @ChildTbl ch
				where ch.ParentId = tb.ParentId
				for xml path('entity_type'), type
			)
			for xml path('entity_group'), type
	)
from @ParentTbl tb
where tb.ParentId = 1
for xml path('entity_type'), type



Но много лишнего кода писать вручную, и так как сущностей может быть несколько, то сделал функцию, не привязанную к конкретной таблице, для трансформации XML:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE FUNCTION dbo.TransformXMLDataset (
	@p_in_simple_xml_dataset XML	
)
RETURNS XML
BEGIN
	RETURN
		(
			select
				t.c.value('local-name(.)', 'varchar(max)') as [@code],
				(
					select
							t1.c1.value('local-name(.)', 'varchar(max)') as [field/@code]
						,	t1.c1.value('.', 'varchar(max)') as [field]
					from t.c.nodes('./*') t1(c1)
					for xml path(''), type
				)
			from @p_in_simple_xml_dataset.nodes('/*')  t(c)
			for xml path ('entity_type'), type
		)
END



Применяю её следующим образом:
Код: sql
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.
declare @ParentTbl as table (ParentId int, Field1 varchar(30), Field2 varchar(30)) ;
declare @ChildTbl as table (ParentID int, ChildId int, ChildField1 varchar(30), ChildField2 varchar(30)) ;

insert into @ParentTbl (ParentId, Field1, Field2)
values (1, 'value1', 'value2')

insert into @ChildTbl (ParentId, ChildId, ChildField1, ChildField2)
values 	(1, 2, 'childvalue1', 'childvalue2'),
		(1, 3, 'childvalue3', 'childvalue4')

declare @ChildXmlData XML, @ParentXmlData XML

set @ChildXmlData = (
	select
		[@code] = 'childs',
		dbo.SVC_ORC_TransformXMLDataset((
			select * from @ChildTbl ch where ParentId = 1
			for xml path('child')
		))
	for xml path('entity_group')
)

set @ParentXmlData = (
	select
		dbo.SVC_ORC_TransformXMLDataset((
			select *, @ChildXmlData from @ParentTbl ch where ParentId = 1
			for xml path('parent')
		))
)
select  @ParentXmlData



Результат
Код: xml
1.
2.
3.
4.
5.
6.
<entity_type code="parent">
  <field code="ParentId">1</field>
  <field code="Field1">value1</field>
  <field code="Field2">value2</field>
  <field code="entity_group">12childvalue1childvalue213childvalue3childvalue4</field>
</entity_type>



Как получить в values() содержимое дочернего узла как XML, c дочерними тегами, а не только текстовое значение?
...
Рейтинг: 0 / 0
XML.nodes().value() - как получить в содержимое узла как XML?
    #40085784
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg Kutuzov,

select ..., cast((select ... from ...for xml) as xml) bzbzbz from ... for xml

коррелированным подзапросом.
...
Рейтинг: 0 / 0
XML.nodes().value() - как получить в содержимое узла как XML?
    #40085804
Serg Kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
Абсолютно не понятно...
...
Рейтинг: 0 / 0
XML.nodes().value() - как получить в содержимое узла как XML?
    #40085814
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg Kutuzov,

Код: sql
1.
2.
3.
4.
5.
6.
7.
set @ParentXmlData = (
 select
  dbo.TransformXMLDataset((select * from @ParentTbl ch where ParentId = 1 for xml path(''))),
  (select [@code] = 'childs', dbo.TransformXMLDataset((select * from @ChildTbl ch where ParentId = 1 for xml path('child'))) for xml path('entity_group'), type)
 for xml path('parent')
)
select @ParentXmlData;
...
Рейтинг: 0 / 0
XML.nodes().value() - как получить в содержимое узла как XML?
    #40086141
Serg Kutuzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Большое спасибо за развёрнутый ответ. А то что-то я зациклился на корректном преобразовании уже итогового XML.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML.nodes().value() - как получить в содержимое узла как XML?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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