将一个元素复制到多行的 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的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++怎么复制多行黏贴到对应位置

Notepad++怎么复制多行黏贴到对应位置

Python使用Openpyxl库将多行多列数据复制到新Excel表示例

如何将可重复使用的多行/多列表从一个 Excel 工作表复制到另一个工作表上的数据库

将数据从 Excel 复制到 SQL 数据库 VB.NET

如何将多行语句字符串放入变量中? [复制]