Биты и байты.

Биты и байты.

четверг, 21 августа 2014 г.

Быстро загрузить XML из файла средствами SQL

Когда нужно быстро загрузить XML из внешнего файла и не хочется делать через SSIS,  очень кстати будет следующий скрипт.



Допустим есть внешний файл следующей структуры.
1.  Загружаем  данные из файла   через OPENROWSET и BULK
2.  Подготавливаем документ к обработке sp_xml_preparedocument
3.  Разбираем файл инструкцией OPENXML
3.  Освобождаем память, удаляем документ sp_xml_removedocument

DECLARE @doc AS XML

SELECT @doc = P
FROM OPENROWSET (BULK 'C:\SHARED\SAMPLEXML.XML',SINGLE_BLOB) AS TEST(P)

DECLARE @hdoc int;

--Процедура sp_xml_preparedocument возвращает дескриптор, по которому можно обратиться к вновь созданному внутреннему представлению XML-документа.
--Считывает входной XML-текст, проводит его синтаксический анализ при помощи средства синтаксического анализатора MSXML (Msxmlsql.dll) и выдает проанализированный документ, готовый к потреблению.

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';

select @doc

--OPENXML Параметры:
--idoc -Дескриптор документа внутреннего представления XML-документа.
--rowpattern -  Шаблон XPath, используемый для идентификации узлов
--flags  -Указывает на сопоставление, которое должно использоваться между XML-данными и реляционным набором строк
-- 0 по атрибутам; 1 по атрибутам затем по элементам; 2 по элементам затем по атрибутам;
SELECT *
FROM OPENXML(@hdoc,'/SampleXML/row',2)
WITH
    (TITLE NVARCHAR(100) '../@TITLE', --.. путь к вышестоящему элементу ../../ два элемента наверх
       GROUPNAME INT '@GROUP', -- сопоставление с атрибутом задается @
       ID INT,
       NAME NVARCHAR(100)
       )

--Удаляет встроенное представление XML-документа, заданного дескриптором документа и делает недействительным дескриптор документа.
EXEC sp_xml_removedocument @hdoc

About