使用XML树不同级别的元素将XML解析为SQL

使用XML树不同级别的元素将XML解析为SQL,sql,sql-server,xml,Sql,Sql Server,Xml,我有一个问题,我需要将一组XML文件解析到SQL数据库中,其中所需的元素都位于XML文件的不同分支中。 到目前为止,我在谷歌上搜索并查看的每个示例都涉及相当简单的XML树 这是XML文件头中引用的架构: 简化XML: <store> <bookstore> <book> <ref_title> <title>Harry Potter</title> </ref_tit

我有一个问题,我需要将一组XML文件解析到SQL数据库中,其中所需的元素都位于XML文件的不同分支中。 到目前为止,我在谷歌上搜索并查看的每个示例都涉及相当简单的XML树

这是XML文件头中引用的架构:

简化XML:

<store>
  <bookstore>
    <book>
      <ref_title>
        <title>Harry Potter</title>
      </ref_title>
      <ref_author>
       <author>J K. Rowling</author>
      </ref_author>
      <year>
        <this_year>2005</this_year>
      </year>
      <price>
        <dollar>usd</dollar>
        <value>29.99</value>
      </price>
      <price>
        <dollar>aud</dollar>
        <value>49.99</value>
      </price>
    </book>
    <book>
      <ref_title>
        <title>Petes Book of Pie</title>
      </ref_title>
      <ref_author>
       <author>Pete P</author>
      </ref_author>
      <year>
        <this_year>1999</this_year>
      </year>
      <price>
        <dollar>usd</dollar>
        <value>19.99</value>
      </price>
      <price>
        <dollar>aud</dollar>
        <value>39.99</value>
      </price>
    </book>
  </bookstore>
</store>
我正在与Microsoft SQL 2019合作,希望能够在SQL-T中完成这一切,但我也看到了Python示例,但运气不佳


有什么提示吗?

您需要在XML数据上使用
节点,并
交叉应用
。这似乎可以让您了解您的目标:


使用沙箱;
去
声明@XML=
哈利·波特
J K.罗琳
2005
美元
29.99
MBaud
49.99
皮特的馅饼书
皮特P
1999
美元
19.99
MBaud
39.99
';
选择bs.b.value('(ref_title/title/text())[1],'nvarchar(50')作为标题,
作为作者的bs.b.value(‘(ref_author/author/text())[1],‘nvarchar(50)’),
bs.b.值(‘(年/本年/文本())[1],‘nvarchar(50)’)作为[年],
p、 d.以美元表示的价值(“(./text())[1]”,“/nvarchar(50)”,
p、 d.value(“(../value/text())[1]”,“nvarchar(50)”作为[value]
FROM(VALUES(@XML))V(X)
交叉应用V.X.nodes('/store/bookstore/book')bs(b)
交叉应用bs.b.nodes(“价格/美元”)p(d)
其中,p.d.值(“(./text())[1]”,“nvarchar(50)”为“美元”;

您需要在XML数据上使用
节点
,并且
交叉应用
。这似乎可以让您了解您的目标:


使用沙箱;
去
声明@XML=
哈利·波特
J K.罗琳
2005
美元
29.99
MBaud
49.99
皮特的馅饼书
皮特P
1999
美元
19.99
MBaud
39.99
';
选择bs.b.value('(ref_title/title/text())[1],'nvarchar(50')作为标题,
作为作者的bs.b.value(‘(ref_author/author/text())[1],‘nvarchar(50)’),
bs.b.值(‘(年/本年/文本())[1],‘nvarchar(50)’)作为[年],
p、 d.以美元表示的价值(“(./text())[1]”,“/nvarchar(50)”,
p、 d.value(“(../value/text())[1]”,“nvarchar(50)”作为[value]
FROM(VALUES(@XML))V(X)
交叉应用V.X.nodes('/store/bookstore/book')bs(b)
交叉应用bs.b.nodes(“价格/美元”)p(d)
其中,p.d.值(“(./text())[1]”,“nvarchar(50)”为“美元”;

谢谢Larnu,我基本上了解那里发生了什么,很抱歉再问一个noob问题。。“如何让乳头从文件中读取而不在查询中包含XML数据?这将是另一个问题,@no_event_记录。谢谢Larnu,我基本上了解那里发生了什么,很抱歉再问一个noob问题。”。。“如何让山雀从文件中读取而不在查询中包含XML数据?这将是另一个问题,@no_event_记录在案。”。
TITLE               AUTHOR          YEAR        DOLLAR      VALUE
Harry Potter        J K. Rowling    2005        usd         49.99
Petes Book of Pie   Pete P          1999        usd         19.99