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

Откуда: СПб
Сообщений: 324
Всем привет.
Задачка такая: сторонняя система (АСУТП) периодически складывает XML-файлы в определенный каталог. Мне нужно выбрать эти файлы и разложить данные в таблицу. После успешной загрузки в идеале нужно "впихнуть" обработанный файл в zip-архив. Все это должно происходить раз в 10-15 минут.
Почему-то мне кажется, что такой функционал можно как-то реализовать с помощью обычных Job'ов или я ошибаюсь и придется писать свой "маленький" сервис/приложение?
Заранее благодарен за советы!
23 май 11, 16:31    [10695478]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Glory
Member

Откуда:
Сообщений: 104751
С помощью Job вы реализуете только "это должно происходить раз в 10-15 минут", а не конкретные операции с вашим файлом
23 май 11, 16:43    [10695612]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
делайте SSIS пакет и шедульте его вызов... как раз и будет с помощью простого джоба
23 май 11, 16:56    [10695768]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Да нафиг этот SSIS-комбайн.
-- BEGIN TRY
-- INSERT @CmdResult
EXEC @Res = sys.xp_CmdShell 'Pre.bat'; -- Check @Res
EXEC dbo.spXmlBulkLoad 'Z:\Path\File.xml', 'Z:\Path\File.xsd', 'MyDataBase';
-- INSERT @CmdResult
EXEC @Res = sys.xp_CmdShell 'Post.bat'; -- Check @Res
-- END TRY BEGIN CATCH ... END CATCH
Обернуть в TRY/CATCH для обработки ошибок.
spXmlBulkLoad: 8075805
Осталось XSD сгенерировать: 8830704
И в bat файлах скачивание файлов в специальный локальный каталог (Z:\Path\), zip-овка и складирование куда-то и удалить мусор.

Да, да задрал уже всех со своим велосипедом.
23 май 11, 23:08    [10697274]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ах да, вместо .bat нужно .cmd
Щас так модно.
23 май 11, 23:10    [10697280]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Спасибо большое за подсказки.
Пошел немного другим путем:
1. создал JOB и в STEP'ах выбрал ActivX Script.
2. написал скрипт VBS и вставил его в STEP JOB'а, который собственно делает, что мне нужно:
- ищет в папке xml-файлы
- пытается данные из xml "всунуть" в таблицу БД
- ведет лог обработки
- архивирует обработанные скрипты (для архивации использовал X-Zip Component)
+ Пример скрипта

p_dest_path = "C:\Work\ISDO\_other\test_load_xml"
p_xml_q_str = "/document/*"

l_date = day(date) & "-" & month(date) & "-" & year(date)	
Dim l_output_fso
set l_output_fso = createobject("Scripting.FileSystemObject") 
l_output_log_path = p_dest_path & "\log_" & l_date & ".log" 

if l_output_fso.FileExists(l_output_log_path) then
	Set l_output = l_output_fso.OpenTextFile(l_output_log_path, 8, true)
else
	Set l_output = l_output_fso.CreateTextFile(l_output_log_path)
end if

Dim l_fso
set l_fso = createobject("Scripting.FileSystemObject") 
Set l_obj_folder = l_fso.GetFolder(p_dest_path)
Set l_files = l_obj_folder.Files

'create DB conection
Dim l_conn
Set l_conn = CreateObject("ADODB.Connection")
l_conn.Open "Provider=SQLOLEDB.1;Data Source=Server;Initial Catalog=DB", "xml_loader", "xml"

For Each l_file In l_files
	if l_fso.getextensionname(l_file) = "xml" then
		
		l_output.Write l_file.Path
		'parse XML
		Set l_xmlDoc = CreateObject("Microsoft.XMLDOM")
		l_xmlDoc.Async = "False"
		l_xmlDoc.Load(l_file.Path)

		Set l_items = l_xmlDoc.selectNodes(p_xml_q_str)
		l_name = ""
		l_descr = ""
		For Each l_item in l_items			
			select case l_item.nodeName
			case "name" 
				l_name = l_item.text
			case "description"
				l_descr = l_item.text
			end select		
		Next
		On Error Resume Next	
		l_conn.Execute "INSERT INTO [dbo].[OPER_TYPE]" & _
                                      "	([OPER_TYPE_NAME]," & _
       			       "         [OPER_TYPE_DESCR])" & _
                               "VALUES" & _
                               "        ('" & l_name & "'," & _
                               "         '" & l_descr & "');" 		
		if Err.Number <> 0 then
			l_output.Write " - DB Error " & CStr(Err.Number) & " at " & Cstr(Time)			
		else	
			Dim l_zip
			Set l_zip = createobject("XStandard.Zip")		
			l_zip_path = p_dest_path & "\" & l_date & ".zip"  
			l_zip.Pack l_file.Path, l_zip_path
			Set l_zip = Nothing
			l_output.Write " - Archived into " & l_zip_path & " at "  & Cstr(Time)
			l_file.delete 			
		end if
		l_output.Write vbcrlf
		On Error Goto 0	
		Set l_xmlDoc = Nothing
	end if
Next
l_output.Write "--------"
l_output.Write vbcrlf
Set l_fso = Nothing
Set l_conn = Nothing
Set l_output_fso = Nothing

4. Указал периодичность запуска и все.

Тоже самое можно было бы сделать и при помощи обычного планировщика Windows, но мне удобнее работать с JOB'ами.
Кому не жаль времени, гляньте пожалуйста, может я чего-то упустил, хотя тестил вроде все, но глаза уже замылились :(.
Буду благодарен за комментарии.
24 май 11, 13:31    [10699777]     Ответить | Цитировать Сообщить модератору
 Re: Разнесение данных из XML-файла по таблицам средствами Job'a?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да все канечно сказочно, НО вариант от Mnior будет грузить в разы быстрее... возьмите свой кусочек скрипта..уберите построчную ставку в таблицу (земените на вариант от Mnior ) и вам пачти счастье будет
24 май 11, 14:12    [10700103]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить