Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML и OPENXML / 5 сообщений из 5, страница 1 из 1
13.12.2018, 12:17
    #39747286
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и OPENXML
Добрый день.

Не могу разобраться, возможно ли с помощью OPENXML превратить xml-данные нижеприведенной структуры в единую ненормированную таблицу со всеми данными? То есть мне-то необходимо просто импортировать все данные и логичное их расположение, естественно, в разных таблицах, но важна скорость реализации.
OPENXML, а не XQuery, потому что мне нужно максимально быстро реализовать задачу, а он проще. Если это не решается с помощью OPENXML, напишите, пожалуйста примерчик на XQuery или любую другую реализацию, если не трудно, как мне выдернуть, например, все адреса и документы по каждому человеку и дальше я сам. А то в интернете примеры все не те, а по документации с наскока разобраться не получилось.

Структура:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<File>
	<FileDate></FileDate>
	<FilePrevDate></FilePrevDate>
	<Items>
		<ItemID></ItemID>
		<ItemType>
			<ItemTypeID></ItemTypeID>
			<ItemTypeName></ItemTypeName>
		<ItemType>
		<Client>
			<FIO></FIO>
			<Doc>
				<DocType></DocType>
				<DocNum></DocNum>
			</Doc>
			<Address>
				<AddressName></AddressName>
			</Address>
		</Client>
	</Items>
</File>




Данные:
Код: 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.
<File>
	<FileDate>20181213</FileDate>
	<FilePrevDate>20181210</FilePrevDate>
	<Items>
		<ItemID>Запись 1</ItemID>
		<ItemType>
			<ItemTypeID>Тип 1</ItemTypeID>
			<ItemTypeName>ИмяТипа 1</ItemTypeName>
		<ItemType>
		<Client>
			<FIO>Иванов Иван Иванович</FIO>
			<Doc>
				<DocType>ТипДокумента1</DocType>
				<DocNum>НомерДокумента1</DocNum>
			</Doc>
			<Doc>
				<DocType>ТипДокумента2</DocType>
				<DocNum>НомерДокумента2</DocNum>
			</Doc>
			<Address>
				<AddressName>Адрес1</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес2</AddressName>
			</Address>
		</Client>
		<Client>
			<FIO>Петров Петр Петрович</FIO>
			<Doc>
				<DocType>ТипДокумента1</DocType>
				<DocNum>НомерДокумента3</DocNum>
			</Doc>
			<Address>
				<AddressName>Адрес1</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес2</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес3</AddressName>
			</Address>
		</Client>
	</Items>
</File>




Что хотелось бы видеть в итоге:
FileDateFilePrevDateItemIDItemTypeIDItemTypeNameFIODocTypeDocNumAddress2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес12018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес22018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес12018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес22018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес3



Структура примерная.
...
Рейтинг: 0 / 0
13.12.2018, 12:23
    #39747294
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и OPENXML
Прошу прощения, ошибся. Данные вот такие
Данные
Код: 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.
<File>
	<FileDate>20181213</FileDate>
	<FilePrevDate>20181210</FilePrevDate>
	<Items>
		<ItemID>Запись 1</ItemID>
		<ItemType>
			<ItemTypeID>Тип 1</ItemTypeID>
			<ItemTypeName>ИмяТипа 1</ItemTypeName>
		<ItemType>
		<Client>
			<FIO>Иванов Иван Иванович</FIO>
			<Doc>
				<DocType>ТипДокумента1</DocType>
				<DocNum>НомерДокумента1</DocNum>
			</Doc>
			<Doc>
				<DocType>ТипДокумента2</DocType>
				<DocNum>НомерДокумента2</DocNum>
			</Doc>
			<Address>
				<AddressName>Адрес1</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес2</AddressName>
			</Address>
		</Client>
		<Client>
			<FIO>Петров Петр Петрович</FIO>
			<Doc>
				<DocType>ТипДокумента1</DocType>
				<DocNum>НомерДокумента3</DocNum>
			</Doc>
			<Address>
				<AddressName>Адрес3</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес4</AddressName>
			</Address>
			<Address>
				<AddressName>Адрес5</AddressName>
			</Address>
		</Client>
	</Items>
</File>




а итоговая ненормированная табличка вот такая
Табличка
FileDateFilePrevDateItemIDItemTypeIDItemTypeNameFIODocTypeDocNumAddress2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес12018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес22018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес12018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес22018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес32018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес42018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес5
...
Рейтинг: 0 / 0
13.12.2018, 12:40
    #39747307
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и OPENXML
Вроде разобрался. Нужно несколько раз вызвать
Код: sql
1.
2.
SELECT  *
FROM OPENXML(@hDoc, N'ПУТЬ_ДО_МНОЖЕСТВЕННОГО_ПУНКТА') 


меняя параметр ПУТЬ_ДО_МНОЖЕСТВЕННОГО_ПУНКТА до всех нод, где у меня предполагается возможность множественных данных с единым тегом, а потом собрать в единую таблицу.
То есть в моем примере, мне нужно вызвать дважды, первый раз до тега, например, <DocType> , а второй до тега <AddressName>

Подтвердите или опровергните мое предположение.
...
Рейтинг: 0 / 0
13.12.2018, 12:52
    #39747315
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и OPENXML
RuCosinusТо есть в моем примере, мне нужно вызвать дважды, первый раз до тега, например, <DocType> , а второй до тега <AddressName> Примерно так. Или получить edge-table и генерировать результат на ее основе.
Если решать через xpath, то будет гораздо проще. Но, возможно, менее производительно.
...
Рейтинг: 0 / 0
13.12.2018, 15:26
    #39747465
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и 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.
33.
34.
35.
--
EXEC sp_xml_preparedocument @XML_Doc_Handle OUTPUT, @XML_Doc;
--
SELECT *
FROM OPENXML (@XML_Doc_Handle, '/File/Items/Client', 2)
WITH (
	FileDate	VARCHAR(100)		'../../FileDate'	
	,FilePrevDate	VARCHAR(100)		'../../FilePrevDate'	
	,ItemID		VARCHAR(100)		'../ItemID'
	,ItemTypeID	VARCHAR(100)		'../ItemType/ItemTypeID'
	,ItemTypeName	VARCHAR(100)		'../ItemType/ItemTypeName'
	,FIO		VARCHAR(100)		'FIO'
    ) t
outer apply (
   SELECT DocType, DocNum 
   FROM OPENXML (@XML_Doc_Handle, '/File/Items/Client/Doc', 2)
   WITH (
		DocType			VARCHAR(100)		'DocType'
		,DocNum			VARCHAR(100)		'DocNum'
		,FIO			VARCHAR(100)		'../FIO'
      ) t1
	where t1.FIO=t.FIO
)	 a1  
outer apply (
   SELECT AddressName
   FROM OPENXML (@XML_Doc_Handle, '/File/Items/Client/Address', 2)
   WITH (
		AddressName		VARCHAR(100)		'AddressName'
		,FIO			VARCHAR(100)		'../FIO'
      ) t1
	where t1.FIO=t.FIO
)	 a2  	  
;
--
EXEC sp_xml_removedocument @XML_Doc_Handle;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML и OPENXML / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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