正在将(大型)XML数据加载到Azure SQL数据库表中

正在将(大型)XML数据加载到Azure SQL数据库表中,xml,tsql,xml-parsing,azure-sql-database,azure-logic-apps,Xml,Tsql,Xml Parsing,Azure Sql Database,Azure Logic Apps,我一直在研究一种将大型XML文件传输到Azure SQL数据库的解决方案,但迄今为止没有成功。XML文件通过固定URL访问。在这个项目之前,我没有使用SQL或Azure的经验,所以如果我错过了一些明显的东西,我很抱歉 我用适当的表设置数据库,我只需要用我的数据填充这些表 XML文件的格式如下,但是有几千个作业。该文件下载时约为1.2Mb,但我想从URL而不是本地计算机访问它 <Response api-method="Current"> <Status>OK</

我一直在研究一种将大型XML文件传输到Azure SQL数据库的解决方案,但迄今为止没有成功。XML文件通过固定URL访问。在这个项目之前,我没有使用SQL或Azure的经验,所以如果我错过了一些明显的东西,我很抱歉

我用适当的表设置数据库,我只需要用我的数据填充这些表

XML文件的格式如下,但是有几千个作业。该文件下载时约为1.2Mb,但我想从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>

好啊
N1234
这里的工作名称
这里的工作描述我没有通过Azure SQL Server从URL加载XML的经验。在普通的SQL Server中有一些奇怪的方法,但我建议您从另一个应用程序读取URL。
但是,由于您设法以某种方式加载了该文件,这似乎不是您的问题

为什么您觉得有必要将其转换为
JSON
?SQLServer可以很好地处理本机XML。标准传输格式是
NVARCHAR(MAX)
,它是一个
UCS-2
-字符串,与
UTF-16
或simple
2字节-unicode
几乎相同。任何
.Net
-字符串都可以按原样发送到SQL Server。
NVARCHAR(MAX)
的大小限制足以满足您的需要

只需创建如下函数,并通过您的阅读应用程序调用它。可以将参数作为字符串传递:

此函数将接受2字节_编码的unicode字符串,并将其隐式转换为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>';
应将结果插入到暂存表中。对这个暂存表执行任何需要的清理和业务逻辑,然后从那里开始

结果

+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| 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       |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+

你应该看看azure data factory,它更适合你所解释的Hanks Thomas,一旦数据是JSON格式,我就计划使用data factory,因为data factory无法处理XML。MitchW-请告诉我您是如何从API获取XML数据的,您选择了哪个操作和触发器Hank you Shnugo,这正是我需要的。简单而有效,感谢您的帮助。
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| 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       |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+