Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос про OPENXML / 5 сообщений из 5, страница 1 из 1
28.01.2022, 16:05
    #40130375
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про OPENXML
Подскажите пожалуйста, как изящнее всего можно решить следующий вопрос
Есть xml примерно такого вида

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        <FIRST>
        	<DATA>2021-11-21</DATA>
        	<NUM>NUM1</NUM>
        	<SECOND>
        		<SECOND_NAME>AAA</SECOND_NAME>
        		<SECOND_DATE>2019-10-01</SECOND_DATE>
        		<METHOD>2</METHOD>
        	</SECOND>        	
        	<SECOND>
        		<SECOND_NAME>BBB</SECOND_NAME>
        		<SECOND_DATE>2019-10-01</SECOND_DATE>
        		<METHOD>3</METHOD>
        	</SECOND>        	
        </FIRSR>
        <FIRST>
        	<DATA>2021-11-22</DATA>
        	<NUM>NUM2</NUM>
        </FIRST>        



При разборе данных через OPENXML я спокойно получаю 2 записи элементов FIRST и 2 элемента SECOND, но у записей нет никакой информации для связи. Т.е таблица в которую я складирую элементы SECOND не имеет никаких id по которым я могу связать ее с таблицей в которой хранятся данные FIRST. Уникальный идентификатор есть уровнем выше (это фрагмент xml ниже), но он получается единым и для элементов FIRST и для SECOND. Как я могу правильно сгенерировать какие-то значения для обоих таблиц по которым я могу четко их связать?
...
Рейтинг: 0 / 0
28.01.2022, 17:29
    #40130398
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про OPENXML
Код: 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.
declare @h int, @x xml ='<ROOT><FIRST>
        	<DATA>2021-11-21</DATA>
        	<NUM>NUM1</NUM>
        	<SECOND>
        		<SECOND_NAME>AAA</SECOND_NAME>
        		<SECOND_DATE>2019-10-01</SECOND_DATE>
        		<METHOD>2</METHOD>
        	</SECOND>        	
        	<SECOND>
        		<SECOND_NAME>BBB</SECOND_NAME>
        		<SECOND_DATE>2019-10-01</SECOND_DATE>
        		<METHOD>3</METHOD>
        	</SECOND>        	
        </FIRST>
        <FIRST>
        	<DATA>2021-11-22</DATA>
        	<NUM>NUM2</NUM>
        </FIRST></ROOT>';

exec sys.sp_xml_preparedocument @h output, @xml;

select * from openxml(@h, '/ROOT/FIRST') with (NUM varchar(30) 'NUM', DATA varchar(30) 'DATA');
select * from openxml(@h, '/ROOT/FIRST/SECOND')
with
(
 NUM varchar(30) '../NUM',
 SECOND_NAME varchar(30) 'SECOND_NAME',
 SECOND_DATE varchar(30) 'SECOND_DATE',
 METHOD varchar(30) 'METHOD'
);

exec sys.sp_xml_removedocument @h;
...
Рейтинг: 0 / 0
28.01.2022, 17:36
    #40130400
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про OPENXML
А если NUM не является каким-то уникальным значением? Чисто технически разными может быть дата, а NUM одинаковым. Я привел скорее некий суррогатный пример, а возможно ли сгенерировать какие-то уникальные идентификаторы самому? Т.е добавить какое-то поле в первую таблицу и ссылаться на это значение во второй?
...
Рейтинг: 0 / 0
28.01.2022, 17:42
    #40130401
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про OPENXML
энди
а возможно ли сгенерировать какие-то уникальные идентификаторы самому?

Самому ничего генерить не нужно, это делает OPENXML: https://docs.microsoft.com/en-us/sql/relational-databases/xml/specify-metaproperties-in-openxml?view=sql-server-ver15 - см. описание метасвойства @mp:id
...
Рейтинг: 0 / 0
28.01.2022, 18:08
    #40130408
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про OPENXML
ооо, огроменное спасибо, пошел читать и пробовать :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос про OPENXML / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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