Оператор LOAD XML. Загрузка данных в базу из XML

[решено] У меня есть 5 больших файлов XML , который я стремлюсь анализировать. Все они слишком велики для открытия в текстовом редакторе , поэтому я не зн

Примеры

Далее следуют примеры.

  • А. Массовый импорт XML-данных в виде двоичного байтового потока

  • Б. Массовый импорт XML-данных в существующую строку

  • В. Массовый импорт XML-данных из файла, содержащего DTD

  • Г. Указание признаков конца поля явным образом при помощи файла форматирования

  • Д. Массовый экспорт XML-данных

11 ответов

по состоянию на 2013 год…

единственный вариант экономии времени, на мой взгляд, для загрузки больших / огромных XML-файлов в SQL Server (как кто-то ранее кратко упоминал), чтобы использовать SQLXML 4.0 библиотека.

Это решение, которое я принял для загрузки огромных XML-файлов (7Гб в размере) на ежедневной основе. Предыдущий процесс, который использовал манипуляции C# в задаче скрипта, занял несколько часов. Использование sqlxml 4.0 занимает 15-20 минут. Как установить SQLXML 4.0. шаг за шагом!—15—>здесь. Для практических примеров в том, как это сделать end to end следуйте по этой ссылке MSDN.

мой XML также имеет вложенные элементы, поэтому он довольно сложный, в результате получается 10 таблиц с 2,5 до 4 миллионами строк каждая (ежедневный файл иногда больше 7 ГБ). Моя работа была основана исключительно на информации, которую я узнал из двух ссылок выше.

  • преимущества:

    • быстро
    • это Microsoft (http://www.microsoft.com/en-gb/download/details.aspx?id=30403)
    • пакет SSIS будет очень упрощен
    • вам не нужно тратить часы и часы, чтобы изменить пакет служб SSIS, если ваша схема XML изменяется. SQLXML может создавать таблицы в SQL Server для вас каждый раз при запуске пакета на основе об отношениях XSD, которые вы предоставляете.
  • недостатки

    • создание XSD может занять некоторое время и требует некоторых знаний. Когда я сделал это, я узнал что-то новое, так что это не было настоящим недостатком для меня.
    • видя, насколько прост пакет служб SSIS, ваш менеджер будет иметь впечатление, что вы не сделали никакой работы.

для просмотра больших файлов использовать Просмотр Больших Текстовых Файлов, милый маленький драгоценный камень.

Примечание: вопрос довольно старый, но «проблема» остается горячей. Я добавил этот пост для разработчиков, которые Google, как массовая загрузка XML-файлов в SSIS и земли здесь.

Я широко тестировал синтаксический анализатор MSSQL xml, bcp.exe утилита отлично работает для этого. Трюк придумывает правый Терминатор строки, так как это должно быть значение, которое не может возникнуть в вашем документе. Например, вы можете сделать следующее:

create table t1(x xml)

Ceate простой текстовый файл, содержащий только выбранный разделитель. Например, поместите эту строку в delim.txt:

-++++++++-

затем объедините это до конца экземпляра документа, из командной строки:

копировать myFile.xml + delim.txt вне.xml / b

после этого вы можете BCP его в базу данных, как:

bcp.тест ехе.dbo.Т1 из.в XML -Т-с-с — r -++++++++-

Если документ UTF-16, то замените переключатель-c на-w

первое, что я сделал, это получить первые X байтов (например, первый 1 МБ) XML-файлов, чтобы я мог взглянуть на них с помощью редактора по моему выбору.

Если у вас Cygwin установлен у вас уже есть хорошая утилита GNU, чтобы достичь этого:глава

head.exe -c1M comments.xml > comments_small.xml

кроме того, можно найти родной порт самой утилиты GNU здесь: http://unxutils.sourceforge.net/

для просмотра очень больших файлов, я нашел V просмотрщик файлов чтобы быть отличным.

Я использовал его для файлов размером до 8 ГБ. Для файлов с фиксированной длиной записи очень легко перемещаться по размеру блока, поскольку он основан на диске.

обратите внимание, что нет возможности редактирования.

сказав это, одна из трудностей с XML заключается в том, что это не очень хороший формат для больших «потоков», так как он имеет общее начало и конец структура и синтаксический анализатор, который не может держать весь файл в памяти, могут сделать некоторые довольно причудливые трюки, чтобы убедиться, что он соответствует DTD или схеме.

вы пробовали использовать OPENROWSET импортировать большие XML-файлы в таблицу SQL Server?

CREATE TABLE XmlTable( ID INT IDENTITY, XmlData XML)INSERT XmlTable(XmlData) SELECT * FROM OPENROWSET(BULK ‘(your path)xmldata.xml’, SINGLE_BLOB) AS X

поскольку у меня нет файлов 5GB под рукой, я не могу проверить это сам.

есть еще один способ решить эту проблему: потоковая передача Linq-to-Xml. Проверьте это блоге где Джеймс Ньютон-Кинг показывает, как читать XElement один за другим, и серия из двух частей здесь и здесь по той же теме командой Microsoft XML блог.

Марк

2 ответа

Лучший ответ

Работа со значениями NULL — это нечто особенное в XML.

Определение значения NULL в XML: не существует . Так

<a> <b>hi</b> <c></c> <d/></a>

  • <a> является корневым элементом.
  • <b> — это элемент с узлом text().
  • <c> — пустой элемент
  • <d> является самозакрывающимся элементом
  • <e> — хм — не там …

Важный совет: <c> и <d> одинаковы, абсолютно без разницы!

Вы можете запросить элемент с

.value(‘(/a/b)[1]’,’nvarchar(100)’)

И вы можете запросить узел text() специально

.value(‘(/a/b/text())[1]’,’nvarchar(100)’)

В этом вы найдете возможный ответ (немного скрытый): вы можете выполнять весь свой код без предиката проверки NULL, если вы запрашиваете узел text() специально.

Изменить это

ref.value(‘record[1][not(@xs:nil = «true»)]’ ,’varchar(100)’)

К этому

ref.value(‘(record[1]/text())[1]’ ,’varchar(100)’)

Что может нарушить это: если содержимое <record> может быть пустой строкой, вы получите NULL назад, а не ». Но это должно быть намного быстрее … Надеюсь, это нормально для вас …

Об эффективности: прочитайте этот ответ. Это покрывает вашу проблему довольно хорошо. Особенно часть, где время расходуется (перейдите по ссылкам в этом ответе).

1

Shnugo 10 Июл 2020 в 21:34

Просто чтобы дополнить ответ @Shnugo.

Вся заслуга ему.

Это ваш точный оператор SQL. Это должно дать вам около 20% улучшения производительности. Пожалуйста, дайте ему шанс.

;WITH XMLNAMESPACES (‘http://www.w3.org/2001/XMLSchema-instance’ as xs, DEFAULT ‘http://somenamespace.whatever.com/schemas/xmldata/1/’)INSERT INTO DataFromXml(Column1, Column2, Column3, Column4, Column5)SELECT ref.value(‘(record[1]/text())[1]’ ,’varchar(100)’) as Column1 ,ref.value(‘(record[2]/text())[1]’ ,’varchar(100)’) as Column2 ,ref.value(‘(record[3]/text())[1]’ ,’varchar(100)’) as Column3 ,ref.value(‘(record[4]/text())[1]’ ,’varchar(100)’) as Column4 ,ref.value(‘(record[5]/text())[1]’ ,’varchar(100)’) as Column5FROM @XML.nodes(‘/myxml/mydata/item’) xmlData(ref);

1

Yitzhak Khabinsky 10 Июл 2020 в 15:13

Introduction

A previous article I wrote on ‘DBA Skills for Developers’ gave a round up of various tips and tricks to make the life of a developer who had ‘inherited’ the task of in-house DBA hopefully a bit better. I was going to expand that article and add information on importing data to SQL server, but decided it is a topic and article that will grow over time so I decided to break it out on its on — and this is it.
 

Решение

Вы были на самом деле не очень далеко.

Чтобы получить атрибут, вы можете сделать это двумя способами:

  1. Доступ к нему, как если бы узел был массивом $node[‘attributeName’]
  2. Используйте метод с именем attribute (), и вы также можете сделать: $node->attributes()->attributeName;

Вот ваш код обновлен:

<?php$url =»http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.industry%20where%20id%20in%20(select%20industry.id%20from%20yahoo.finance.sectors)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys»;$ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_URL, $url); //getting url contents$data = curl_exec ($ch); //execule curl requestcurl_close($ch);$xml = simplexml_load_string($data);$con=mysql_connect(«localhost», «root», «»); //connect to servermysql_select_db(«symbol_list», $con) or die(mysql_error()); //select databaseforeach ($xml->results->industry as $industryNode){foreach ($industryNode->company as $companyNode){$industry = (string) $industryNode[‘name’];$company = (string) $companyNode[‘name’];$symbol = (string) $companyNode[‘symbol’];// perform sql query$sql = «INSERT INTO ‘symbols_xml’ (‘industry’, ‘company’, ‘symbol’)». «VALUES (‘$industry’, ‘$company’, ‘$symbol’)»;$result = mysql_query($sql);if (!$result){echo ‘MySQL ERROR’;}else{echo ‘SUCCESS’;}}}

2

Синтаксис оператора LOAD XML

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Оператор LOAD XML считывает данные в таблицу из XML-файла;

file_name – имя файла в виде строки.

В дополнительном операторе ROWS IDENTIFIED BY tagname должен быть записан в виде литеральной строки и окружен угловыми скобками ( ).

Для записи данных из таблицы в XML-файл можно использовать следующую команду:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Для считывания файла назад в таблицу нужно использовать оператор LOAD XML INFILE.

Элемент – эквивалент строки таблицы БД.

Данный оператор поддерживает 3 разных формата XML:

  • Имена столбцов задаются через атрибуты и соответствующие им значения столбцов:

    Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

  • Имена столбцов задаются в виде тегов и значений столбцов как наполнения этих тегов:

    Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

  • Имена столбцов name в атрибуте :

    Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Данный формат используется другими инструментами MySQL (например, mysqldump).

Все форматы можно использовать в одном и том же XML-файле.

Пункт IGNORE number ROWS или IGNORE number LINES пропускает первый number строки в XML-файле.

Рассмотрим использование данного оператора на примере.

Пример 1

Предположим, что таблица создана следующим образом:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Предположим, что данная таблица пуста.

Далее предположим, что существует простой XML-файл person.xml, который содержит следующие данные:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Для импорта данных в person.xml в таблицу person можно воспользоваться следующим оператором:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Считается, что person.xml находится в каталоге данных MySQL.

В ситуации, когда файл не может быть найден, появится следующее сообщение об ошибке:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Пункт ROWS IDENTIFIED BY » ставит в соответствие каждый элемент в XML-файле строке таблицы, в которую импортируются данные. В данном примере это таблица person в базе данных test.

В результате будут импортированы 6 строк в таблицу test.person. Проверить результат можно с помощью простого оператора SELECT:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

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

Для выполнения обратных действий, т.е. вывода табличных данных MySQL в XML-файл, можно, используя mysql клиент, выполнить следующие команды:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Опция —xml позволяет mysql клиенту использовать для вывода форматирование XML;

Опция –e заставляет клиент сразу после опции выполнить SQL-оператор.

С помощью пункта ROWS IDENTIFIED BY » можно импортировать данные из одного XML-файла в таблицу базы данных с разными определениями.

Пример 2

Предположим, что существует файл address.xml, содержащий следующий XML:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Можно снова воспользоваться таблицей test.person, очистить все существующие записи и показать ее структуру:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Далее создадим таблицу address в базе данных test при использовании оператора CREATE TABLE:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Для импорта данных из XML-файла в таблицу person выполним следующий оператор LOAD XML, определяющий строки в виде элементов :

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

Проверить импорта записей выполняется с помощью оператора SELECT:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

У элементов в XML-файле, начиная с , нет никаких соответствующих столбцов в таблице person , поэтому их пропускают.

Для импорта данных из элементов в таблицу address используем оператор LOAD XML, как показано на рисунке:

Оператор LOAD XML. Загрузка данных в базу из XML. Автор24 — интернет-биржа заказчиков и авторов

С помощью оператора SELECT можно проверить, были ли данные импортированы.

Данные из элемента не импортируется. Однако, столбец person_id в таблице address, значение атрибута person_id от родительского элемента для каждого импортируется в таблицу address.

Другие решения

Других решений пока нет …

History

21 Jan 2016 — Version 1
10 Feb 2016 — Version 2 — added im/ex wizard
17 Feb 2016 — Version 3 — added Azure/cloud section, added section on advanced BCP im/ex
12 Apr 2016 — Version 4 — Updated code, added sample SQL download script

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: