sql - 如何将xml的嵌套层次结构转换为sql表

标签 sql sql-server-2008 xquery

使用 MSSQL 2008 和 XQUERY

考虑存储在表中的以下 XML:

<ROOT>
  <WrapperElement>
    <ParentElement ID=1>
      <Title>parent1</Title>
      <Description />
      <ChildElement ID="6">
        <Title>Child 4</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
      <ChildElement ID="0">
        <Title>Child1</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
      <ChildElement ID="8">
        <Title>Child6</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
    </ParentElement>
  </WrapperElement>
</Root>

我想把这个 xml 分解成类似的东西
PE!ID | PE!Title | PE!Description | CE!ID | CE!Title | CE!StartDate |...
1     | parent1  |                | 6     | child 4  |  2010-... |
1     | parent1  |                | 0     | child1   | 2010-...  |

等等。

注意:在本例中,每个 ParentElement 可能有许多 ChildElement。
我一直在尝试使用 xquery,但是我一直无法浏览复杂的元素。

基本上,我试图做与 FOR XML 对表所做的完全相反的事情,只是使用一组更简单的数据来处理。

关于下一步去哪里或如何实现这一目标的任何想法?

谢谢

最佳答案

这个怎么样(我将 @input 声明为带有您的 XML 内容的 XML 数据类型变量 - 相应地替换):

SELECT
    Parent.Elm.value('(@ID)[1]', 'int') AS 'ID',
    Parent.Elm.value('(Title)[1]', 'varchar(100)') AS 'Title',
    Parent.Elm.value('(Description)[1]', 'varchar(100)') AS 'Description',
    Child.Elm.value('(@ID)[1]', 'int') AS 'ChildID',
    Child.Elm.value('(Title)[1]', 'varchar(100)') AS 'ChildTitle',
    Child.Elm.value('(StartDate)[1]', 'DATETIME') AS 'StartDate',
    Child.Elm.value('(EndDate)[1]', 'DATETIME') AS 'EndDate'
FROM
    @input.nodes('/ROOT/WrapperElement/ParentElement') AS Parent(Elm)
CROSS APPLY
    Parent.Elm.nodes('ChildElement') AS Child(Elm)

您基本上遍历所有 /ROOT/WrapperElement/ParentElemet节点(如 Parent(Elm) 伪表),然后对于这些条目中的每一个,您执行 CROSS APPLY对于包含在其中的子元素 ParentElement并提取必要的信息。

应该工作 - 我希望!

关于sql - 如何将xml的嵌套层次结构转换为sql表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359908/

相关文章:

mysql - SQL 查询计数 = 0/null

MySQL从多个表中删除行

sql-server-2008 - "neater"节假日计算方式

xml - 在 XQuery 1.0 中使用 for 创建列表

xml - 如何在xquery中通过变量选择属性?

xml - 如何使用 LET 和 WHERE 获取元素的名称?

mysql - MySQL 中所有公司的贸易总和 [删除]

sql - 带有 UPDATE SET CASE 语句的 T-SQL MERGE - 没有 ELSE 会发生什么?

当我使用 LIKE 运算符时,SQL-Server 会忽略我的 COLLATION

C# 将 sql datetime 与 null 进行比较