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

2024-01-11

使用 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-...  |

etc.

注意:在此示例中,每个 ParentElement 可能有多个 ChildElement。 我一直在尝试使用 xquery,但是我无法导航这样的复杂元素。

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

关于下一步该去哪里或如何实现这一目标有什么想法吗?

Thanks


这个怎么样(我声明了@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并提取必要的信息。

应该有效 - 我希望!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 第一个计算机程序是如何创建的? [复制]

    这个问题在这里已经有答案了 可能的重复 第一个编译器是如何编写的 https stackoverflow com questions 1653649 how was the first compiler written 这个问题一直困扰着我
  • 在 Python 中,为什么应该使用 JSON 方案而不是字典? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这是对原始问题的编辑 Python 字典和 JSON 有什么区别 需要澄清 虽然对我来说这是非常清晰和合乎逻辑的 无论如何 这是一种 改进
  • ASP.Net 程序员还应该参考哪些其他框架来获取代码灵感?

    ASP Net 程序员还应该参考哪些其他框架来获取代码灵感 扩大您的搜索范围 不要只关注 ASP NET MVC 不同的方法将帮助您更好地理解您想做的事情 一些建议 RoR http www rubyonrails org Django h
  • 您能否关闭 IE7 中的 XSS 保护,以便 Intranet 应用程序可以知道异地 IFRAME 的内容?

    TL DR 我是否可以在受控环境中关闭 Internet Explorer 中的 XSS 保护 以便可以操作 IFRAMES 内的 DOM 我正在接待区为公共计算机创建一个信息亭 让我们的用户可以浏览我们的网站以及其他一些地方政府相关网站
  • 如何在组件内部使用 ngx-translate

    我在我的网站内使用 ngx translate 唯一的问题是我知道如何在 html 模板内使用它 它工作得很好 但我如何调用 keyJSON内部组件 这就是我所需要的 app html div home translate div 这工作正
  • 如何将 eax 寄存器、ah 和 al 中的值移动 2 个字节? x86 汇编

    我有一个关于如何在 x86 程序集 eax 寄存器中移动值的问题 我知道 32 位寄存器可分解为更小的组件寄存器 其中较低的 16 位为 ax 而 16 位则进一步分解为 8 位寄存器 ah 和 al 我目前正在为 x86 汇编语言作业编写
  • 导出文件期间检测到打开代码语句递归

    我尝试在 SAS 中导出文件 但收到 检测到打开代码语句递归 错误 由于我根据根据提示日期定义为宏变量的日期导出多个文件 因此我想用此变量命名要导出的文件 但它不起作用 如果有人帮助我 我将非常感激 rep date 30APR2015 0
  • 另一个作业完成后重新创建作业

    我有以下情况 job1 和 job2 同时访问服务器 并且都返回状态401 这意味着我的令牌访问权限已过期 我需要进行刷新 我启动 job3 它返回了新令牌 在这种情况下 我必须根据请求使用新令牌重新创建 job1 和 job2 并启动它们
  • 算术运算导致溢出c#

    解锁文件时出现以下错误 算术运算导致溢出 系统 IntPtr ToInt32 我怀疑是下面一行pBuffer ToInt32 IntPtr iPtr new IntPtr pBuffer ToInt32 i Marshal SizeOf f
  • 手动控制 UIView 动画的进度,而不是在持续时间内自动控制

    我想设置一个 UIView 动画 但我想控制百分比进度并让它自动为我插入值 而不是花费给定的时间 那可能吗 谢谢 我想我已经明白了 紧接着 UIView animate 块之后 在根视图上执行以下操作 view layer speed 0
  • tm.getDeviceId() 已弃用?

    我得到了IMEI和设备 ID 所以我遇到了问题getDeviceId 已弃用 TelephonyManager tm TelephonyManager getSystemService this TELEPHONY SERVICE imei
  • 如何修复“运行错误:无法获取机器“boot2docker-vm”:机器不存在”?

    Running boot2docker与start info stop delete参数会导致错误消息 snowch boot2docker start error in run Failed to get machine boot2doc
  • 在一种条件下检查 NaN、null 和 >=0

    我有一个 var a 其值可以是NaN null and any ve ve number including 0 我需要一个条件来过滤掉 a 的所有值 这样只有 gt 0 值才能在 if 条件下产生 true 实现这一目标的最佳方法是什么
  • 如何将 OpenID 添加到 php 站点?

    我非常喜欢 StackOverflow 使用 OpenID 进行注册 我该如何将其添加到我的网站中 它是基于 PHP 的 我访问了 openid net 并查看了那里的库 但几乎找不到文档或示例 本教程对我之前使用 PHP 和 OpenID
  • 我可以在不符合 PCI 要求的情况下存储用户银行详细信息吗?

    我们正在开发一个项目 其性质在某种程度上是乘车共享 我读到了有关 PCI 合规性的内容 我知道如果我们处理信用卡或付款 我们必须符合 PCI 合规性 我有点模棱两可 我们是否存储司机的银行信息 例如帐号 加密 数据库中的帐户名称等 我已阅读
  • 浮点不准确示例

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 您如何向仍然认为计算机无限聪明和准确的新程序员和外行解释浮点不准确 您是否有一个最喜欢的例子或
  • 如何获得 Elixir 的可靠跳转定义?

    我尝试了 Jet Brains 的 Elixir 插件 以及 VS Code 的两个插件 但到目前为止 它们都没有可靠地引导我定义函数和模块 显然部分原因是因为 Elixir lsp 无法处理内部的事情scope块 https github
  • 如何在Android Studio中包含*.so库?

    我读了很多线程如何将 so 库添加到 Android Studio 但它们都不起作用 特别是当涉及到文本时 This does not work with the new xxx Android Studio gradle 我们可以重新开始
  • 使用ggplot绘制趋势线

    我使用 ggplot2 根据我的数据绘制趋势线 以下是我使用电子表格所做的事情 但我只想显示趋势线 如上图所示的黑线 而不是所有点 因为观察数量 gt 20 000 所以我尝试使用 ggplot2 做同样的事情 fig a lt ggplo
  • 如何将 xml 的嵌套层次结构转换为 sql 表

    使用 MSSQL 2008 和 XQUERY 考虑存储在表中的以下 XML