将一个元素复制到多行的 XML 导入 SQL
Posted
技术标签:
【中文标题】将一个元素复制到多行的 XML 导入 SQL【英文标题】:Importing XML to SQL with one element coppied to multiple rows 【发布时间】:2020-06-30 05:02:49 【问题描述】:假设我有许多 XML 文件要导入到新的 SQL 数据库中,每个 XML 文件都有不同数量的 <book>
分支,这些分支将被导入到新行(感谢 @987654321,我大部分时间都解决了这个问题@) 但每个 XML 文件也有一个 <country>
元素,该元素对于该 XML 文件中的所有 <book>
都是通用的。
如何从文件夹中读取每个 *.xml 文件并像这样导入:
test1.xml
<store>
<bookstore>
<book>
<ref_title>
<title>Harry Potter</title>
</ref_title>
<ref_author>
<author>J K. Rowling</author>
</ref_author>
</book>
<book>
<ref_title>
<title>Petes Book of Pie</title>
</ref_title>
<ref_author>
<author>Pete P</author>
</ref_author>
</book>
</bookstore>
...
<countrycode>
<country>Australia</country>
</countrycode>
</store>
Test2.xml
<store>
<bookstore>
<book>
<ref_title>
<title>Gotta Go Fast</title>
</ref_title>
<ref_author>
<author>Dr Speed</author>
</ref_author>
</book>
<book>
<ref_title>
<title>If It Aint Broke</title>
</ref_title>
<ref_author>
<author>Mr fixit</author>
</ref_author>
</book>
</bookstore>
...
<countrycode>
<country>USA</country>
</countrycode>
</store>
SQL 输出:
TITLE AUTHOR COUNTRY
Harry Potter J K. Rowling Australia
Petes Book of Pie Pete P Australia
Gotta Go Fast Dr Speed USA
If It Aint Broke Mr fixit USA
再次感谢您的帮助!
【问题讨论】:
检查这是否有助于找到答案:stat.berkeley.edu/~statcur/Workshop2/Presentations/XML.pdf 【参考方案1】:这是一个可以帮助您入门的示例。您可以在 SSMS 中运行它。
-- Fetch data from files...
DECLARE @Data VARCHAR(MAX);
SELECT @Data = BulkColumn
FROM OPENROWSET ( BULK 'E:\Temp\test1.xml', SINGLE_CLOB ) AS x;
SELECT @Data = @Data + BulkColumn
FROM OPENROWSET ( BULK 'E:\Temp\test2.xml', SINGLE_CLOB ) AS x;
-- Set @Data into an XML variable with a "root" element.
DECLARE @xml XML = CAST( '<root>' + @Data + '</root>' AS XML );
-- Return the XML results.
SELECT
doc.fld.value ( 'data(ref_title/title)[1]', 'VARCHAR(255)' ) AS [TITLE],
doc.fld.value ( 'data(ref_author/author)[1]', 'VARCHAR(255)' ) AS [AUTHOR],
doc.fld.value ( 'data(../../countrycode/country)[1]', 'VARCHAR(255)' ) AS [COUNTRY]
FROM @xml.nodes( '//root/store/bookstore/book' ) doc ( fld );
返回
+-------------------+--------------+-----------+
| TITLE | AUTHOR | COUNTRY |
+-------------------+--------------+-----------+
| Harry Potter | J K. Rowling | Australia |
| Petes Book of Pie | Pete P | Australia |
| Gotta Go Fast | Dr Speed | USA |
| If It Aint Broke | Mr fixit | USA |
+-------------------+--------------+-----------+
注意:为了以这种方式使用 OPENROWSET/BULK,文件(在本例中为 test1.xml 和 test2.xml)必须存在于服务器上SQL 正在运行,并且 SQL 必须有权访问其位置。
还值得注意的是,如果 XML 格式错误或文件为空,此示例不会实现错误处理。它只是作为您入门的参考。
test1.xml的内容
<store>
<bookstore>
<book>
<ref_title>
<title>Harry Potter</title>
</ref_title>
<ref_author>
<author>J K. Rowling</author>
</ref_author>
</book>
<book>
<ref_title>
<title>Petes Book of Pie</title>
</ref_title>
<ref_author>
<author>Pete P</author>
</ref_author>
</book>
</bookstore>
<countrycode>
<country>Australia</country>
</countrycode>
</store>
test2.xml的内容
<store>
<bookstore>
<book>
<ref_title>
<title>Gotta Go Fast</title>
</ref_title>
<ref_author>
<author>Dr Speed</author>
</ref_author>
</book>
<book>
<ref_title>
<title>If It Aint Broke</title>
</ref_title>
<ref_author>
<author>Mr fixit</author>
</ref_author>
</book>
</bookstore>
<countrycode>
<country>USA</country>
</countrycode>
</store>
【讨论】:
以上是关于将一个元素复制到多行的 XML 导入 SQL的主要内容,如果未能解决你的问题,请参考以下文章
Python使用Openpyxl库将多行多列数据复制到新Excel表示例