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

Откуда:
Сообщений: 51
Добрый день.

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

+ Структура:

<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>



+ Данные:

<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>



+ Что хотелось бы видеть в итоге:

FileDateFilePrevDateItemIDItemTypeIDItemTypeNameFIODocTypeDocNumAddress
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес1
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес2
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес1
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес2
2018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес3



Структура примерная.
13 дек 18, 12:17    [21762751]     Ответить | Цитировать Сообщить модератору
 Re: XML и OPENXML  [new]
RuCosinus
Member

Откуда:
Сообщений: 51
Прошу прощения, ошибся. Данные вот такие
+ Данные

<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>



а итоговая ненормированная табличка вот такая
+ Табличка

FileDateFilePrevDateItemIDItemTypeIDItemTypeNameFIODocTypeDocNumAddress
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес1
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента1НомерДокумента1Адрес2
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес1
2018121320181213Запись 1Тип 1ИмяТипа 1Иванов Иван ИвановичТипДокумента2НомерДокумента2Адрес2
2018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес3
2018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес4
2018121320181213Запись 1Тип 1ИмяТипа 1Петров Петр ПетровичТипДокумента1НомерДокумента3Адрес5

13 дек 18, 12:23    [21762766]     Ответить | Цитировать Сообщить модератору
 Re: XML и OPENXML  [new]
RuCosinus
Member

Откуда:
Сообщений: 51
Вроде разобрался. Нужно несколько раз вызвать
SELECT  *
FROM OPENXML(@hDoc, N'ПУТЬ_ДО_МНОЖЕСТВЕННОГО_ПУНКТА') 

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

Подтвердите или опровергните мое предположение.
13 дек 18, 12:40    [21762800]     Ответить | Цитировать Сообщить модератору
 Re: XML и OPENXML  [new]
invm
Member

Откуда: Москва
Сообщений: 9344
RuCosinus
То есть в моем примере, мне нужно вызвать дважды, первый раз до тега, например, <DocType>, а второй до тега <AddressName>
Примерно так. Или получить edge-table и генерировать результат на ее основе.
Если решать через xpath, то будет гораздо проще. Но, возможно, менее производительно.
13 дек 18, 12:52    [21762825]     Ответить | Цитировать Сообщить модератору
 Re: XML и OPENXML  [new]
court
Member

Откуда:
Сообщений: 2013
--
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;
13 дек 18, 15:26    [21763102]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить