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

Откуда: Екатеринбург
Сообщений: 307
Добрый день! Помогите, плз, оптимизировать код (парсинг xml), нужно СРОЧНО закачать 800000 файлов, а приведенным кодом 50000 вкачивается уже 6 часов.((( Интересует содержимое тега ib.

SELECT
   b.value('local-name(.)','nvarchar(20)') teg ,
   b.value('@nDistr'      ,'int') nDistr    ,
   b.value('@nComp'       ,'int') nComp     ,
   b.value('@directory'   ,'nvarchar(20)') directory ,
   b.value('@name'        ,'nvarchar(400)') name      ,
   b.value('@nCat'        ,'int') nCat      ,
   b.value('@nTexts'      ,'int') nTexts    ,
   b.value('@n3'          ,'int') n3        ,
   b.value('@n4'          ,'int') n4        ,
   b.value('@n5'          ,'int') n5        ,
   b.value('@n6'          ,'int') n6        ,
   b.value('@compliance'  ,'nvarchar(50)') compliance,
   
   cast(case when len(d.value('./@date'      ,'nvarchar(15)'))>3 then d.value('./@date'      ,'nvarchar(15)') else null end as date) data      ,
   d.value('./@time'      ,'nvarchar(15)') tim      ,
   cast(case when len(d.value('./@sysdate'   ,'nvarchar(15)'))>3 then d.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate    ,
   d.value('./@docs'      ,'int') docs      ,
   d.value('./@kind'      ,'nvarchar(5)') kind      ,
   
   cast(case when len(e.value('./@date'      ,'nvarchar(15)'))>3 then e.value('./@date'      ,'nvarchar(15)') else null end as date) data2      ,
   e.value('./@time'      ,'nvarchar(15)') tim2      ,
   cast(case when len(e.value('./@sysdate'   ,'nvarchar(15)'))>3 then e.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate2    ,
   e.value('./@docs'      ,'int') docs2      ,
   e.value('./@kind'      ,'nvarchar(5)') kind2      ,
   
   cast(case when len(f.value('./@date'      ,'nvarchar(15)'))>3 then f.value('./@date'      ,'nvarchar(15)') else null end as date) data3      ,
   f.value('./@time'      ,'nvarchar(15)') tim3      ,
   cast(case when len(f.value('./@sysdate'   ,'nvarchar(15)'))>3 then f.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate3    ,
   f.value('./@docs'      ,'int') docs3      ,
   f.value('./@kind'      ,'nvarchar(5)') kind3      ,
   
   cast(case when len(g.value('./@date'      ,'nvarchar(15)'))>3 then g.value('./@date'      ,'nvarchar(15)') else null end as date) data4      ,
   g.value('./@time'      ,'nvarchar(15)') tim4      ,
   cast(case when len(g.value('./@sysdate'   ,'nvarchar(15)'))>3 then g.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate4    ,
   g.value('./@docs'      ,'int') docs4      ,
   g.value('./@kind'      ,'nvarchar(5)') kind4      ,
   
   cast(case when len(h.value('./@date'      ,'nvarchar(15)'))>3 then h.value('./@date'      ,'nvarchar(15)') else null end as date) data5      ,
   h.value('./@time'      ,'nvarchar(15)') tim5      ,
   cast(case when len(h.value('./@sysdate'   ,'nvarchar(15)'))>3 then h.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate5    ,
   h.value('./@docs'      ,'int') docs5      ,
   h.value('./@kind'      ,'nvarchar(5)') kind5      ,
   
   cast(case when len(k.value('./@date'      ,'nvarchar(15)'))>3 then k.value('./@date'      ,'nvarchar(15)') else null end as date) data6      ,
   k.value('./@time'      ,'nvarchar(15)') tim6      ,
   cast(case when len(k.value('./@sysdate'   ,'nvarchar(15)'))>3 then k.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate6    ,
   k.value('./@docs'      ,'int') docs6      ,
   k.value('./@kind'      ,'nvarchar(5)') kind6      ,
   
   cast(case when len(l.value('./@date'      ,'nvarchar(15)'))>3 then l.value('./@date'      ,'nvarchar(15)') else null end as date) data7      ,
   l.value('./@time'      ,'nvarchar(15)') tim7      ,
   cast(case when len(l.value('./@sysdate'   ,'nvarchar(15)'))>3 then l.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate7    ,
   l.value('./@docs'      ,'int') docs7      ,
   l.value('./@kind'      ,'nvarchar(5)') kind7      ,
   
   cast(case when len(m.value('./@date'      ,'nvarchar(15)'))>3 then m.value('./@date'      ,'nvarchar(15)') else null end as date) data8      ,
   m.value('./@time'      ,'nvarchar(15)') tim8      ,
   cast(case when len(m.value('./@sysdate'   ,'nvarchar(15)'))>3 then m.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate8    ,
   m.value('./@docs'      ,'int') docs8      ,
   m.value('./@kind'      ,'nvarchar(5)') kind8      ,
   
   cast(case when len(n.value('./@date'      ,'nvarchar(15)'))>3 then n.value('./@date'      ,'nvarchar(15)') else null end as date) data9      ,
   n.value('./@time'      ,'nvarchar(15)') tim9      ,
   cast(case when len(n.value('./@sysdate'   ,'nvarchar(15)'))>3 then n.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate9    ,
   n.value('./@docs'      ,'int') docs9      ,
   n.value('./@kind'      ,'nvarchar(5)') kind9      ,
   
   cast(case when len(o.value('./@date'      ,'nvarchar(15)'))>3 then o.value('./@date'      ,'nvarchar(15)') else null end as date) data10      ,
   o.value('./@time'      ,'nvarchar(15)') tim10      ,
   cast(case when len(o.value('./@sysdate'   ,'nvarchar(15)'))>3 then o.value('./@sysdate'   ,'nvarchar(15)') else null end as date) sysdate10    ,
   o.value('./@docs'      ,'int') docs10      ,
   o.value('./@kind'      ,'nvarchar(5)') kind10      ,
  
   @id as id 
   FROM @XMl.nodes('/user_info/ib/*') a(b)
     CROSS APPLY a.b.nodes('updates[1]/*[1]') c(d)
     CROSS APPLY a.b.nodes('updates[1]/*[2]') x(e)
     CROSS APPLY a.b.nodes('updates[1]/*[3]') y(f)
     CROSS APPLY a.b.nodes('updates[1]/*[4]') z(g)
     CROSS APPLY a.b.nodes('updates[1]/*[5]') u(h)
     CROSS APPLY a.b.nodes('updates[1]/*[6]') v(k)
     CROSS APPLY a.b.nodes('updates[1]/*[7]') w(l)
     CROSS APPLY a.b.nodes('updates[1]/*[8]') r(m)
     CROSS APPLY a.b.nodes('updates[1]/*[9]') p(n)
     CROSS APPLY a.b.nodes('updates[1]/*[10]') i(o)


К сообщению приложен файл (CONS.XML - 6Kb) cкачать
8 сен 15, 15:48    [18123787]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
Glory
Member

Откуда:
Сообщений: 104751
используйте для задач правильные инструменты https://msdn.microsoft.com/en-us/library/ms171993.aspx
8 сен 15, 15:52    [18123828]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Если не хотите через XML Bulk Load, то так должно быть быстрее:
+
declare @x xml = N'<?xml version="1.0" encoding="UTF-16"?>
<user_info>
	<format_version>8</format_version>
	<ric>78</ric>
	<res_version>4012.00.75.138090</res_version>
	<cons_exe_version>4012.00.35</cons_exe_version>
	<tech_info>
		<Processors>
			<Name>Intel(R) Core(TM) i5 CPU         760  @ 2.80GHz</Name>
			<Frequency>2.81 GHz</Frequency>
			<AllCore>4</AllCore>
		</Processors>
		<RAM>3255</RAM>
		<OS>
			<Name>Windows XP Professional Service Pack 3</Name>
			<Version
				Major="5"
				Minor="1"
			/>
			<Build>2600</Build>
			<PlatformID>2</PlatformID>
			<Edition>Professional</Edition>
			<Capacity>x32</Capacity>
			<LangUI>Russian</LangUI>
			<CompatibilityMode>Не установлен</CompatibilityMode>
		</OS>
		<BootDisk>
			<Name>C</Name>
			<FreeSpace>4842</FreeSpace>
		</BootDisk>
		<Office>Microsoft Office 2010 14.0.6024.1000</Office>
		<Browser>Opera Internet Browser 12.17</Browser>
		<MailAgent>Microsoft Outlook 14.0.6025.1000</MailAgent>
		<Rights>Administrator</Rights>
		<DiskFreeSpace>39520</DiskFreeSpace>
		<FileSystem>NTFS</FileSystem>
		<Users
			OD="0"
			UD="0"
			TS="0"
			VM="0"
		/>
	</tech_info>
	<files>
		<USR_FILE date="29.12.2014" time="10.56.58" kind="P" uptime="00.00.05" />
		<info.cfg date="00.00.0000" time="00.00" />
		<info.cod date="10.12.2009" time="11.51" />
		<consult.tor date="24.12.2014" time="20.07" />
	</files>
	<package>
		<LAW_1
			distr="447116"
			comp="1"
			ric="78"
			netCount="1"
			userType="SPF"
			technolType=""
			format="1"
		/>
		<MED_18
			distr="16195"
			comp="1"
			ric="78"
			netCount="1"
			userType="SPF"
			technolType=""
			format="1"
		/>
		<RLAW071_7
			distr="70404"
			comp="1"
			ric="71"
			netCount="1"
			userType="SPF"
			technolType=""
			format="1"
		/>
	</package>
	<ib>
		<LAW nDistr="447116" nComp="1" directory="LAW" name="Российское законодательство (Версия Проф)" nCat="172798" nTexts="172798" n3="172798" n4="172798" n5="172798" n6="0" compliance="#HOST">
			<updates>
				<u1 date="29.12.2014" time="06.08" sysdate="29.12.2014" docs="172798" kind="I" /><u2 date="26.12.2014" time="06.10" sysdate="26.12.2014" docs="172706" kind="I" /><u3 date="25.12.2014" time="06.06" sysdate="25.12.2014" docs="172624" kind="I" /><u4 date="24.12.2014" time="06.09" sysdate="24.12.2014" docs="172530" kind="I" /><u5 date="23.12.2014" time="06.07" sysdate="23.12.2014" docs="172456" kind="I" /><u6 date="22.12.2014" time="06.06" sysdate="22.12.2014" docs="172397" kind="I" /><u7 date="19.12.2014" time="06.08" sysdate="19.12.2014" docs="172327" kind="I" /><u8 date="17.12.2014" time="06.04" sysdate="17.12.2014" docs="172245" kind="I" /><u9 date="16.12.2014" time="06.04" sysdate="16.12.2014" docs="172169" kind="I" /><u10 date="15.12.2014" time="06.04" sysdate="15.12.2014" docs="172088" kind="I" />
			</updates>
		</LAW>
		<RGSS nDistr="447116" nComp="1" directory="RGSS" name="Решения госорганов по спорным ситуациям" nCat="20647" nTexts="20647" n3="20647" n4="20647" n5="20647" n6="0" compliance="=HOST">
			<updates>
				<u1 date="25.12.2014" time="06.07" sysdate="25.12.2014" docs="20647" kind="I" /><u2 date="24.12.2014" time="06.10" sysdate="24.12.2014" docs="20617" kind="I" /><u3 date="11.12.2014" time="06.04" sysdate="11.12.2014" docs="20576" kind="I" /><u4 date="04.12.2014" time="06.08" sysdate="04.12.2014" docs="20533" kind="I" /><u5 date="27.11.2014" time="06.17" sysdate="27.11.2014" docs="20477" kind="I" /><u6 date="20.11.2014" time="06.04" sysdate="20.11.2014" docs="20416" kind="I" /><u7 date="13.11.2014" time="06.43" sysdate="13.11.2014" docs="20371" kind="I" /><u8 date="06.11.2014" time="06.04" sysdate="06.11.2014" docs="20315" kind="I" /><u9 date="30.10.2014" time="06.03" sysdate="30.10.2014" docs="20246" kind="I" /><u10 date="23.10.2014" time="06.04" sysdate="23.10.2014" docs="20189" kind="I" />
			</updates>
		</RGSS>
		<RLAW071 nDistr="70404" nComp="1" directory="RLAW071" name="Свердловская область" nCat="144061" nTexts="144061" n3="144061" n4="144061" n5="144061" n6="0" compliance="=HOST">
			<updates>
				<u1 date="29.12.2014" time="06.09" sysdate="29.12.2014" docs="144061" kind="I" /><u2 date="26.12.2014" time="06.11" sysdate="26.12.2014" docs="144033" kind="I" /><u3 date="25.12.2014" time="06.07" sysdate="25.12.2014" docs="144002" kind="I" /><u4 date="24.12.2014" time="06.10" sysdate="24.12.2014" docs="143952" kind="I" /><u5 date="17.12.2014" time="06.05" sysdate="17.12.2014" docs="143534" kind="I" /><u6 date="16.12.2014" time="06.06" sysdate="16.12.2014" docs="143455" kind="I" /><u7 date="15.12.2014" time="06.04" sysdate="15.12.2014" docs="143368" kind="I" /><u8 date="12.12.2014" time="06.09" sysdate="12.12.2014" docs="143307" kind="I" /><u9 date="11.12.2014" time="06.04" sysdate="11.12.2014" docs="143260" kind="I" /><u10 date="10.12.2014" time="06.04" sysdate="10.12.2014" docs="143218" kind="I" />
			</updates>
		</RLAW071>
		<DOF nDistr="447116" nComp="1" directory="DOF" name="Дополнительные формы" nCat="3691" nTexts="3691" n3="3691" n4="3691" n5="3691" n6="0" compliance="=HOST">
			<updates>
				<u1 date="29.12.2014" time="06.09" sysdate="29.12.2014" docs="3691" kind="I" /><u2 date="24.12.2014" time="06.10" sysdate="24.12.2014" docs="3691" kind="I" /><u3 date="15.12.2014" time="06.05" sysdate="15.12.2014" docs="3688" kind="I" /><u4 date="08.12.2014" time="06.07" sysdate="08.12.2014" docs="3688" kind="I" /><u5 date="01.12.2014" time="06.07" sysdate="01.12.2014" docs="3656" kind="I" /><u6 date="24.11.2014" time="06.04" sysdate="24.11.2014" docs="3654" kind="I" /><u7 date="17.11.2014" time="06.08" sysdate="17.11.2014" docs="3659" kind="I" /><u8 date="10.11.2014" time="06.07" sysdate="10.11.2014" docs="3657" kind="I" /><u9 date="03.11.2014" time="06.05" sysdate="03.11.2014" docs="3655" kind="I" /><u10 date="27.10.2014" time="06.06" sysdate="27.10.2014" docs="3657" kind="I" />
			</updates>
		</DOF>
		<MED nDistr="16195" nComp="1" directory="MED" name="Медицина и фармацевтика" nCat="60622" nTexts="60622" n3="60622" n4="60622" n5="60622" n6="0" compliance="=HOST">
			<updates>
				<u1 date="29.12.2014" time="06.09" sysdate="29.12.2014" docs="60622" kind="I" /><u2 date="26.12.2014" time="06.11" sysdate="26.12.2014" docs="60600" kind="I" /><u3 date="25.12.2014" time="06.08" sysdate="25.12.2014" docs="60580" kind="I" /><u4 date="24.12.2014" time="06.10" sysdate="24.12.2014" docs="60560" kind="I" /><u5 date="17.12.2014" time="06.19" sysdate="17.12.2014" docs="60455" kind="I" /><u6 date="15.12.2014" time="06.05" sysdate="15.12.2014" docs="60405" kind="I" /><u7 date="12.12.2014" time="06.10" sysdate="12.12.2014" docs="60380" kind="I" /><u8 date="11.12.2014" time="06.04" sysdate="11.12.2014" docs="60355" kind="I" /><u9 date="10.12.2014" time="06.05" sysdate="10.12.2014" docs="60330" kind="I" /><u10 date="09.12.2014" time="06.06" sysdate="09.12.2014" docs="60305" kind="I" />
			</updates>
		</MED>
	</ib>
</user_info>';

declare @h int;

exec dbo.sp_xml_preparedocument @h output, @x;

select
 *
from
 openxml(@h, '/user_info/ib/*')
with
(
 tag nvarchar(20) '@mp:localname',
 nDistr int '@nDistr',
 nComp int '@nComp',
 directory nvarchar(20) '@directory',
 name nvarchar(400) '@name',
 nCat int '@nCat',
 nTexts int '@nTexts',
 n3 int '@n3',
 n4 int '@n4',
 n5 int '@n5',
 n6 int '@n6',
 compliance nvarchar(50) '@compliance',

 data nvarchar(15) 'updates[1]/*[1][string-length(@date) > 3]/@date',
 tim nvarchar(15) 'updates[1]/*[1]/@time',
 sysdate nvarchar(15) 'updates[1]/*[1][string-length(@sysdate) > 3]/@sysdate',
 docs int 'updates[1]/*[1]/@docs',
 kind nvarchar(5) 'updates[1]/*[1]/@kind',

 data2 nvarchar(15) 'updates[1]/*[2][string-length(@date) > 3]/@date',
 tim2 nvarchar(15) 'updates[1]/*[2]/@time',
 sysdate2 nvarchar(15) 'updates[1]/*[2][string-length(@sysdate) > 3]/@sysdate',
 docs2 int 'updates[1]/*[2]/@docs',
 kind2 nvarchar(5) 'updates[1]/*[2]/@kind',

 data3 nvarchar(15) 'updates[1]/*[3][string-length(@date) > 3]/@date',
 tim3 nvarchar(15) 'updates[1]/*[3]/@time',
 sysdate3 nvarchar(15) 'updates[1]/*[3][string-length(@sysdate) > 3]/@sysdate',
 docs3 int 'updates[1]/*[3]/@docs',
 kind3 nvarchar(5) 'updates[1]/*[3]/@kind',

 data4 nvarchar(15) 'updates[1]/*[4][string-length(@date) > 3]/@date',
 tim4 nvarchar(15) 'updates[1]/*[4]/@time',
 sysdate4 nvarchar(15) 'updates[1]/*[4][string-length(@sysdate) > 3]/@sysdate',
 docs4 int 'updates[1]/*[4]/@docs',
 kind4 nvarchar(5) 'updates[1]/*[4]/@kind',

 data5 nvarchar(15) 'updates[1]/*[5][string-length(@date) > 3]/@date',
 tim5 nvarchar(15) 'updates[1]/*[5]/@time',
 sysdate5 nvarchar(15) 'updates[1]/*[5][string-length(@sysdate) > 3]/@sysdate',
 docs5 int 'updates[1]/*[5]/@docs',
 kind5 nvarchar(5) 'updates[1]/*[5]/@kind',

 data6 nvarchar(15) 'updates[1]/*[6][string-length(@date) > 3]/@date',
 tim6 nvarchar(15) 'updates[1]/*[6]/@time',
 sysdate6 nvarchar(15) 'updates[1]/*[6][string-length(@sysdate) > 3]/@sysdate',
 docs6 int 'updates[1]/*[6]/@docs',
 kind6 nvarchar(5) 'updates[1]/*[6]/@kind',

 data7 nvarchar(15) 'updates[1]/*[7][string-length(@date) > 3]/@date',
 tim7 nvarchar(15) 'updates[1]/*[7]/@time',
 sysdate7 nvarchar(15) 'updates[1]/*[7][string-length(@sysdate) > 3]/@sysdate',
 docs7 int 'updates[1]/*[7]/@docs',
 kind7 nvarchar(5) 'updates[1]/*[7]/@kind',

 data8 nvarchar(15) 'updates[1]/*[8][string-length(@date) > 3]/@date',
 tim8 nvarchar(15) 'updates[1]/*[8]/@time',
 sysdate8 nvarchar(15) 'updates[1]/*[8][string-length(@sysdate) > 3]/@sysdate',
 docs8 int 'updates[1]/*[8]/@docs',
 kind8 nvarchar(5) 'updates[1]/*[8]/@kind'
);

exec dbo.sp_xml_removedocument @h;
8 сен 15, 17:27    [18124412]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
спасибо за ответы, буду пробовать оба варианта
8 сен 15, 18:17    [18124590]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
ShkrylAndrei
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 42
Почему вы не хотите выложить описание задачи полностью, т.е. как именно изначально поставлена задача и по какому алгоритму вы ее решаете?. Тогда будет легче понять что вы хотите и предложить альтернативные варианты решения.
8 сен 15, 19:06    [18124798]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
ShkrylAndrei
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 42
Т.е., что это за файлы, почему именно XML, и почему именно такой объем данных?
Обычно, если задача сформулированна верно, с точки зрения информатики, то некоторые вещи проясняются сами собой, если инженер отказывается от того - чтобы провести детализацию задачи, то в процессе решения "на коленках" возникают ошибки, которые не сразу можно выяснить.
8 сен 15, 19:08    [18124800]     Ответить | Цитировать Сообщить модератору
 Re: ПАРСИНГ XML  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
ShkrylAndrei, задача залить в базу 800000 xml файлов.

Вариант invm отлично справляется, спасибо за помощь)
8 сен 15, 19:53    [18124994]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить