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

Откуда:
Сообщений: 3
Добрый вечер!

Вводные: есть порядка тысячи XML файлов с одинаковой XSD схемой.
Как сделать массовый импорт этих XML файлов в MS SQL с дальнейшим парсингом по столбцам таблицы?

P.s.: в интернете нашел вариант единичного импорта xml файлов

Заранее благодарен за помощь!
31 май 17, 22:47    [20529194]     Ответить | Цитировать Сообщить модератору
 Re: Импорт нескольких XML в MS SQL  [new]
debtcollection
Member

Откуда:
Сообщений: 3
Вот здесь https://msdn.microsoft.com/ru-ru/library/ms171806(v=sql.120).aspx
31 май 17, 22:48    [20529200]     Ответить | Цитировать Сообщить модератору
 Re: Импорт нескольких XML в MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
debtcollection,

SSIS, цикл по элементам каталога, внутри цикла импорт файла.
1 июн 17, 10:56    [20530312]     Ответить | Цитировать Сообщить модератору
 Re: Импорт нескольких XML в MS SQL  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
declare @Xml xml

--Получаем список файлов
declare @files table (Id int identity, output varchar(128), depth int, isFile int)
Insert into @files(output, depth, isFile)
exec xp_dirtree @SourcePath,1,1
delete from @files where output not like '%.xml' or isFile <> 1


--В цикле перебираем.
While exists(select output from @files )
BEGIN
 set @Source = @SourcePath+(select top 1 output from @files order by id)

 if OBJECT_ID('tempdb..#BulkImport') is not null drop table #BulkImport
 CREATE TABLE #BulkImport (BulkColumn varbinary(max))

--Загружаем файл в xml переменную
exec ('Insert into #BulkImport SELECT * FROM OPENROWSET( BULK '''+@Source+''',  SINGLE_BLOB) AS x ')
set @Xml = (select BulkColumn from #BulkImport)


--Работаем с xml переменной, распихиваем данные по таблицам.
Insert into MyTable (f1, f2)
select 
  t.n.value('(Header/DocumentReceiveDateTime)[1]', 'datetime') as DocumentReceiveDateTime,
  t.n.value('(Header/DocumentID)[1]', 'int') as DocumentID
from @xml.nodes('/Document') t(n)

delete from @files where id = (select top 1 id from @files order by id)
END 
2 июн 17, 11:47    [20534074]     Ответить | Цитировать Сообщить модератору
 Re: Импорт нескольких XML в MS SQL  [new]
aleks2
Guest
Deff
declare @Xml xml

--Получаем список файлов
declare @files table (Id int identity, output varchar(128), depth int, isFile int)
Insert into @files(output, depth, isFile)
exec xp_dirtree @SourcePath,1,1
delete from @files where output not like '%.xml' or isFile <> 1


--В цикле перебираем.
While exists(select output from @files )
BEGIN
 set @Source = @SourcePath+(select top 1 output from @files order by id)

 if OBJECT_ID('tempdb..#BulkImport') is not null drop table #BulkImport
 CREATE TABLE #BulkImport (BulkColumn varbinary(max))

--Загружаем файл в xml переменную
exec ('Insert into #BulkImport SELECT * FROM OPENROWSET( BULK '''+@Source+''',  SINGLE_BLOB) AS x ')
set @Xml = (select BulkColumn from #BulkImport)


--Работаем с xml переменной, распихиваем данные по таблицам.
Insert into MyTable (f1, f2)
select 
  t.n.value('(Header/DocumentReceiveDateTime)[1]', 'datetime') as DocumentReceiveDateTime,
  t.n.value('(Header/DocumentID)[1]', 'int') as DocumentID
from @xml.nodes('/Document') t(n)

delete from @files where id = (select top 1 id from @files order by id)
END 


Это тока для баловства годится.
Медленно и пичально.

sqlXmlBulkLoad - вот истинный дао.
2 июн 17, 16:42    [20535565]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить