当前位置: 首页 > 面试题库 >

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

拓拔弘厚
2023-03-14
问题内容

使用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可能有许多ChildElements。我一直在尝试使用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对其中包含的子元素执行a操作,ParentElement并提取必要的信息。

应该工作-我希望!



 类似资料:
  • 问题内容: 我是Hibernate和HQL的新手。我想在HQL中编写一个更新查询,其SQL等效项如下: 是的PK ,是的FK和PK 。有一对一的映射。 相应的Java类是Patient(患者)(具有lastName,firstName,doctorId字段)和Doctor(具有DoctorId字段)。 谁能告诉我上面的SQL查询的HQL等效项是什么? 非常感谢。 问题答案: 如果您检查规范,则可以

  • 几天来,我一直在考虑这个“简单”的练习,结果被困住了。我都快疯了。我需要将嵌套数组转换为HTML。下面是数组的示例: 而预期的结果应该是这样的: 我已经从一个helper函数开始(从数组创建每个标记),下面是它现在的样子: 到目前为止还不错。当我试图创建实际的HTML构建器函数时,这个棘手的部分就开始了。我想迭代数组的每个元素,检查它是否有一个嵌套的元素(子),保存指定的标记,再深入一些。 到目前

  • 我试图基于表示路径的元素从平面XML创建嵌套层次结构。每个

  • 问题内容: 我敢肯定有一种非常简单而优雅的方法可以做到这一点,但是我不太清楚。我有一些看起来像这样的输入数据: 如果可能,我想使用d3.js嵌套运算符来获取要在层次结构布局中使用的结构。像这样: 问题答案: 您不能在此处使用nest运算符,因为嵌套会产生固定的层次结构:输出层次结构中的级别数与您指定的键函数的数量相同。 也就是说,您可以编写自己的函数来生成树。假设根节点是输入数组中的第一个节点,则

  • 问题内容: 我有一个代码可以使用功能将我的avro记录转换为Row 此功能不适用于嵌套模式。 谁能建议我如何将复杂的架构转换为ROW? 问题答案: 有,但是不幸的是私人的。有一些PR可以将其公开,但是它们从未合并: https://github.com/databricks/spark-avro/pull/89 https://github.com/databricks/spark-avro/pu

  • 当我试图使用ModelMapper将嵌套的java对象转换为嵌套的DTO时,我遇到了一个问题。在父DTO对象中,子DTO为null。以下是代码片段。 实体类: DTO的课程: 这是映射器代码: 输出: 输出用户DTO:UserDTO[名称=xyz,地址=null,产品=null] 在这里,我想将用户实体转换为UserDTO-dto。我得到了地址和产品DTO的空值。我在这里到底缺少什么?有人知道吗?