Загрузка (больших) данных XML в таблицу базы данных SQL Azure - PullRequest
0 голосов
/ 22 ноября 2018

Я работал над решением для передачи большого XML-файла в базу данных SQL Azure, но пока безуспешно.Доступ к XML-файлу осуществляется через фиксированный URL-адрес.У меня нет предыдущего опыта использования SQL или Azure до этого проекта, поэтому я извиняюсь, если упустил что-то очевидное.

Я настраиваю базу данных с помощью соответствующих таблиц, мне просто нужно заполнить таблицы своими данными.

Файл XML поставляется в следующем формате, однако существует несколько тысяч заданий.Размер загружаемого файла составляет приблизительно 1,2 МБ, однако я хочу получить к нему доступ с URL-адреса, а не с локального компьютера.

<Response api-method="Current">
  <Status>OK</Status>
     <Jobs>
        <Job>
           <ID>N1234</ID>
           <Name>Job name here</Name>
           <Description/>Job description here</Description
           <StartDate>2018-10-08T00:00:00</StartDate>
           <DueDate>2018-10-21T00:00:00</DueDate>
           <Manager>
              <ID>12345</ID>
              <Name>John Smith</Name>
           </Manager>
        </Job>
        <Job>
            Repeat above several thousand times
        </Job>
     </Jobs>
</Response>

Пока что мой самый успешный метод работает с использованием некоторых встроенных приложений логики Azure.Я использую HTML GET для загрузки данных XML, а затем передаю их в приложение Liquid, которое преобразует XML в JSON.Затем я ожидаю, что формат JSON может быть легко загружен в таблицу базы данных.Это приложение логики успешно преобразует XML в JSON, но только когда я сокращаю файл до ~ 80 заданий.Следовательно, я знаю, что мое логическое приложение работает и что размер файла - моя проблема.

Приложение XML для JSON Logic

Есть ли у кого-нибудь предложение для лучшего подхода илиметод, позволяющий обрабатывать файлы большего размера?Я также пытался использовать SSMS, реализовывать T-SQL BulkInsert, OpenRowSet и т. Д., Но на данный момент я отказался от этого подхода.

Небольшой выбор источников, которые я использовал, пытаясь найти решение:

Большое спасибо

1 Ответ

0 голосов
/ 22 ноября 2018

У меня нет опыта работы с , как загрузить XML из URL через Azure SQL Server normal SQL-Server есть несколько странных подходов, но я бы рекомендовал прочитать URL-адрес из другого приложения.
Но - поскольку вам удалось каким-то образом загрузить файл - это не похоже наваша проблема в любом случае.

Почему вы чувствуете необходимость преобразовать это в JSON?SQL-Server может неплохо работать с нативным XML.Стандартный формат передачи - NVARCHAR(MAX), то есть строка UCS-2, которая почти совпадает с UTF-16 или простой 2-byte-unicode.Любая строка .Net может быть отправлена ​​на SQL-сервер как .Предельный размер NVARCHAR(MAX) достаточно велик для ваших нужд ...

Просто создайте функцию, подобную следующей, и вызовите ее через приложение для чтения.Вы можете передать параметр в виде строки:

Эта функция будет принимать 2-байтовую_кодированную строку в юникоде и неявно преобразовывать ее в XML:

CREATE FUNCTION dbo.ReadTheXml(@xml XML)
RETURNS TABLE
AS
RETURN
    SELECT @xml.value('(/Response/Status/text())[1]','nvarchar(max)') AS Response_Status
          ,job.value('(ID/text())[1]','nvarchar(max)') AS Job_ID
          ,job.value('(Name/text())[1]','nvarchar(max)') AS Job_Name
          ,job.value('(Description/text())[1]','nvarchar(max)') AS Job_Description
          ,job.value('(StartDate/text())[1]','datetime') AS Job_StartDate
          ,job.value('(DueDate/text())[1]','datetime') AS Job_DueDate
          ,job.value('(Manager/ID/text())[1]','int') AS Job_Manager_ID
          ,job.value('(Manager/Name/text())[1]','nvarchar(max)') AS Job_Manager_Name
    FROM @xml.nodes('/Response/Jobs/Job') A(job)
GO

- Предполагаявы уже загрузили XML в строку, вы можете проверить это следующим образом:

DECLARE @xml NVARCHAR(MAX) =         --the xml as NVARCHAR(MAX) string
N'<Response api-method="Current">
  <Status>OK</Status>
     <Jobs>
        <Job>
           <ID>N1234</ID>
           <Name>Job name here</Name>
           <Description>Job description here</Description>
           <StartDate>2018-10-08T00:00:00</StartDate>
           <DueDate>2018-10-21T00:00:00</DueDate>
           <Manager>
              <ID>12345</ID>
              <Name>John Smith</Name>
           </Manager>
        </Job>
        <Job>
           <ID>blah</ID>
           <Name>One more</Name>
           <Description>This is one more description</Description>
           <StartDate>2018-10-08T00:00:00</StartDate>
           <DueDate>2018-10-21T00:00:00</DueDate>
           <Manager>
              <ID>12345</ID>
              <Name>John Smith</Name>
           </Manager>
        </Job>
     </Jobs>
</Response>';

- Используйте функцию точно так же, как вы используете таблицу:

SELECT * INTO #tmpStagingTable 
FROM dbo.ReadTheXml(@xml); --pass in the XML as string

--call the result from the staging table
SELECT * FROM #tmpStagingTable;  --create a staging table *on the fly*
GO

--clean up for testing
DROP FUNCTION dbo.ReadTheXml;
DROP TABLE #tmpStagingTable;

Результат должен быть вставлен в промежуточный стол.Выполните все необходимые операции очистки и бизнес-логики для этой промежуточной таблицы и продолжайте оттуда.

Результат

+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| Response_Status | Job_ID | Job_Name      | Job_Description              | Job_StartDate           | Job_DueDate             | Job_Manager_ID | Job_Manager_Name |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| OK              | N1234  | Job name here | Job description here         | 2018-10-08 00:00:00.000 | 2018-10-21 00:00:00.000 | 12345          | John Smith       |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| OK              | blah   | One more      | This is one more description | 2018-10-08 00:00:00.000 | 2018-10-21 00:00:00.000 | 12345          | John Smith       |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...