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

Bet*_*033 3 sql xquery sql-server-2008

使用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>
Run Code Online (Sandbox Code Playgroud)

我想将这个xml分解成类似的东西

PE!ID | PE!Title | PE!Description | CE!ID | CE!Title | CE!StartDate |...
1     | parent1  |                | 6     | child 4  |  2010-... |
1     | parent1  |                | 0     | child1   | 2010-...  |
Run Code Online (Sandbox Code Playgroud)

等等

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

基本上,我正在尝试与FOR XML对表所做的完全相反,只是使用更简单的数据集来处理.

关于下一步该怎么做或如何实现这一点的任何想法?

谢谢

mar*_*c_s 6

这个怎么样(我声明@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)
Run Code Online (Sandbox Code Playgroud)

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

应该工作 - 我希望!