正在将(大)XML 数据加载到 Azure SQL 数据库 table
Loading (large) XML data into Azure SQL database table
我一直在研究将大型 XML 文件传输到 Azure SQL 数据库的解决方案,但迄今为止未成功。 XML 文件通过固定 URL 访问。在这个项目之前,我没有使用 SQL 或 Azure 的经验,所以如果我遗漏了一些明显的东西,我深表歉意。
我用适当的 table 设置了数据库,我只需要用我的数据填充 table。
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>
到目前为止,我最成功的方法是使用一些内置的 Azure 逻辑应用程序。我正在使用 HTML GET 加载 XML 数据,然后将其传递到将 XML 转换为 JSON 的 Liquid 应用程序中。然后我希望 JSON 格式可以很容易地加载到数据库中 table。此逻辑应用程序成功地将 XML 转换为 JSON,但只有当我将文件剥离到约 80 个作业时。因此我知道我的逻辑应用程序可以工作,文件大小是我的问题。
XML to JSON Logic App
有没有人有更好的方法或允许处理更大文件的方法的建议?我也尝试过使用 SSMS,实现 T-SQL BulkInsert、OpenRowSet 等,但我暂时放弃了这种方法。
我在尝试寻找解决方案时使用的少量来源:
- How can I to read a XML from a URL using T-SQL?
- Load data from XML file to SQL database in Azure using Logic Apps
- 数不清的 MVA 视频
非常感谢
我没有关于如何通过 Azure SQL 服务器 从 URL 加载 XML 的经验。在 normal SQL-Server 中有一些奇怪的方法,但我建议从另一个应用程序读取 URL。
但是 - 当您设法以某种方式加载文件时 - 这似乎不是您的问题。
为什么您觉得有必要将其转换为 JSON
? SQL-服务器可以很好地处理原生 XML。标准传输格式是NVARCHAR(MAX)
,这是一个UCS-2
-string,与UTF-16
或简单的2-byte-unicode
几乎相同。任何 .Net
-string 都可以按原样 发送到 SQL-Server 。 NVARCHAR(MAX)
的大小限制足以满足您的需求...
只需创建如下所示的函数并通过您的阅读应用程序调用它。您可以将参数作为字符串传递:
此函数将接受 2-byte_encoded 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>';
-- 使用函数的方式与使用 table:
的方式完全相同
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;
应将结果插入分段 table。针对此阶段执行任何需要的清理和业务逻辑 table 并从那里继续。
结果
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| 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 |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
我一直在研究将大型 XML 文件传输到 Azure SQL 数据库的解决方案,但迄今为止未成功。 XML 文件通过固定 URL 访问。在这个项目之前,我没有使用 SQL 或 Azure 的经验,所以如果我遗漏了一些明显的东西,我深表歉意。
我用适当的 table 设置了数据库,我只需要用我的数据填充 table。
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>
到目前为止,我最成功的方法是使用一些内置的 Azure 逻辑应用程序。我正在使用 HTML GET 加载 XML 数据,然后将其传递到将 XML 转换为 JSON 的 Liquid 应用程序中。然后我希望 JSON 格式可以很容易地加载到数据库中 table。此逻辑应用程序成功地将 XML 转换为 JSON,但只有当我将文件剥离到约 80 个作业时。因此我知道我的逻辑应用程序可以工作,文件大小是我的问题。
XML to JSON Logic App
有没有人有更好的方法或允许处理更大文件的方法的建议?我也尝试过使用 SSMS,实现 T-SQL BulkInsert、OpenRowSet 等,但我暂时放弃了这种方法。
我在尝试寻找解决方案时使用的少量来源:
- How can I to read a XML from a URL using T-SQL?
- Load data from XML file to SQL database in Azure using Logic Apps
- 数不清的 MVA 视频
非常感谢
我没有关于如何通过 Azure SQL 服务器 从 URL 加载 XML 的经验。在 normal SQL-Server 中有一些奇怪的方法,但我建议从另一个应用程序读取 URL。
但是 - 当您设法以某种方式加载文件时 - 这似乎不是您的问题。
为什么您觉得有必要将其转换为 JSON
? SQL-服务器可以很好地处理原生 XML。标准传输格式是NVARCHAR(MAX)
,这是一个UCS-2
-string,与UTF-16
或简单的2-byte-unicode
几乎相同。任何 .Net
-string 都可以按原样 发送到 SQL-Server 。 NVARCHAR(MAX)
的大小限制足以满足您的需求...
只需创建如下所示的函数并通过您的阅读应用程序调用它。您可以将参数作为字符串传递:
此函数将接受 2-byte_encoded 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>';
-- 使用函数的方式与使用 table:
的方式完全相同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;
应将结果插入分段 table。针对此阶段执行任何需要的清理和业务逻辑 table 并从那里继续。
结果
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+
| 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 |
+-----------------+--------+---------------+------------------------------+-------------------------+-------------------------+----------------+------------------+