SQL 2016 - 将 XML 转换为 Json

2024-03-06

我正在尝试使用 SQL2016 中的 FOR JSON PATH 将 XML 列转换为 Json,但遇到一些问题。给定以下 XML(请注意,某些 Product 元素可能包含 Product 列表):

  <Request>
    <SelectedProducts>
      <Product id="D04C01S01" level="1" />
      <Product id="158796" level="1" />
      <Product id="7464" level="2">
        <Product id="115561" level="3" />
      </Product>
      <Product id="907" level="2">
        <Product id="12166" level="3" />
        <Product id="33093" level="3" />
        <Product id="33094" level="3" />
        <Product id="28409" level="3" />
      </Product>
      <Product id="3123" level="2">
        <Product id="38538" level="3" />
        <Product id="37221" level="3" />
      </Product>
    </SelectedProducts>    
  </Request>

我可以在 SQL 上运行以下语句(其中 @xml 是上面的 XML):

SELECT 
     d.value('./@id', 'varchar(50)') AS 'Id'
    ,d.value('./@level', 'int') AS 'Level'
    ,(SELECT 
        --f.value('../@id', 'varchar(50)') AS 'ParentId'
        f.value('./@id', 'varchar(50)') AS 'Id'
        ,f.value('./@level', 'int') AS 'Level'
        --FROM @xml.nodes('/Request/SelectedProducts/Product[@id="3123"]/Product') AS e(f)          
        FROM @xml.nodes('/Request/SelectedProducts/Product/Product') AS e(f)            
        FOR JSON PATH) 'Product'
    FROM @xml.nodes('/Request/SelectedProducts/Product') AS c(d)
    FOR JSON PATH

它生成的Json是这样的:

[{"Id":"D04C01S01", 
  "Level":2,
  "Product":[{"Id":"115561", "Level":3 }, {"Id":"12166","Level":3 }, { Id":"33093", "Level":3 }, {"Id":"33094","Level":3 }, {"Id":"28409","Level":3},
{"Id":"38538","Level":3},{"Id":"37221","Level":3 }]},

{"Id":"158796", 
  "Level":3,
  "Product":[{"Id":"115561", "Level":3 }, {"Id":"12166","Level":3 }, { Id":"33093", "Level":3 }, {"Id":"33094","Level":3 }, {"Id":"28409","Level":3},
{"Id":"38538","Level":3},{"Id":"37221","Level":3 }]...

正如您所看到的,问题在于,在生成的 Json 中,所有元素最终都会生成所有 Product,无论它们的父关系如何。

我想我缺少一个 WHERE 子句,我可以在其中检查它是否属于父节点,但我不知道如何进行。

我尝试添加节点 Product[@id="3123"] (请参阅注释行),但我需要替换实际父 id 的“3123”,但我不知道该怎么做。

另一种选择是实际保存父 ID(请参阅注释行 ParentId),然后在结果中使用 JSON_MODIFY 删除不匹配的元素,但我也没有成功。

有人对我如何解决这个问题有任何想法吗?或者我还能做什么?

-- EDIT这是我期待的 Json:

[{"Request": 
[{"Id":"D04C01S01","Level":1 }, 
{"Id":"158796","Level":1},
{"Id":"7464","Level":2,"Product":[{"Id":"115561","Level":3}]},
{"Id":"907","Level":2,"Product":[{"Id":"12166","Level":3},{"Id":"33093","Level":3},{"Id":"33094","Level":3},{"Id":"28409","Level":3}]},
{"Id":"3123","Level":2,"Product":[{"Id":"38538","Level":3},{"Id":"37221","Level":3}]}]}]

您可以假设,如果 Level=1,则不会有产品子级别,如果 Level=2,则将有产品子级别。

谢谢


内部节点集上的 XPath 将从 XML 中选择所有节点,而不仅仅是外部节点的子节点。

(我身上没有 SQL2016 的副本,但类似的东西应该可以工作。)

SELECT 
    d.value('./@id', 'varchar(50)') AS 'Id'
    ,d.value('./@level', 'int') AS 'Level'
    ,(SELECT 
        f.value('./@id', 'varchar(50)') AS 'Id'
        ,f.value('./@level', 'int') AS 'Level'
        FROM c.d.nodes('./Product') AS e(f)            
        FOR JSON PATH) 'Product'
FROM @xml.nodes('/Request/SelectedProducts/Product') AS c(d)
FOR JSON PATH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 2016 - 将 XML 转换为 Json 的相关文章

  • BULK INSERT 返回错误“访问被拒绝”

    运行批量插入时 BULK INSERT MyDatabase dbo MyTable FROM Mylaptop UniversalShare SQLRuleOutput csv WITH FIRSTROW 2 FIELDTERMINATO
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • C# 和 SQL Server:如果字符串值为空,如何在命令参数中插入 DBNull.Value?

    我已经搜索了几个小时 但找不到解决方案 我正在将一些字符串插入 SQL 但是有时 我用来执行此操作的方法可能包含空字符串 即 因此我想在 SQL Server 中插入一个空值 首先我测试我的方法以确保我能够插入DBNull Value通过使
  • 将维基百科中的表格加载到 R 中

    我正在尝试从以下 URL 将最高法院法官表加载到 R 中 https en wikipedia org wiki List of Justices of the Supreme Court of the United States http
  • 当附加触发器时,Linq-to-sql 插入和更新失败

    我最近在 linq to sql 方面遇到了一些问题 问题在于 当我们将触发器附加到事件时 它 认为 插入和更新失败 一个例子可以是一行 当一行被更改时 附加一个触发器将 LastUpdated 冒号设置为当前时间 这将导致 linq to
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 如何在 SQL Server 2012 中选择除一列之外的所有列? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以选择所有列 但只选择我不想选择的特定列 我的意思是有时我会遇到这样的问题 表有数百个字段 而我只需要删除一个字段 我需要重写所有列吗 有什么窍门吗 喜欢select
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • 从基本表单加上 XML 生成自定义表单文档?

    这是我的第一次堆栈溢出 而且很复杂 对不起 我的任务是从基本模板和一些 XML 生成自定义文档without每种情况都有一个自定义表单设计元素 Here s 整个画面 我们正在构建一个 Lotus Notes 客户端 而不是 Web 应用程
  • TransactionScope 是否需要开启 DTC 服务?

    根据我的阅读 为了在 NET 中使用 TransactionScope 您需要运行 Windows 中的分布式事务协调器服务 我有那个服务关掉 并且我的应用程序似乎运行相同并且回滚事务没有问题 我错过了什么吗 它如何能够发挥作用呢 我正在运
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • SQL Server 文件操作?

    使用 SQL Server 2005 如何使用 T SQL 将文件读入 SPROC 所以 假设我有一个像这样的 CSV 文件 ID OtherUselessData 1 asdf 2 asdf 3 asdf etc 我基本上想这样做 Sel
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西

随机推荐

  • 如何在 Eclipse 中通过远程 Java 应用程序调试来调试 Groovy 代码

    我正在努力调试一个构建为 Sling 捆绑包的应用程序 该应用程序几乎完全是 Groovy 代码 我有 Groovy Eclipse 插件 Eclipse 使用 Maven 正在构建 jar 并将其安装在 Sling 中 没有任何问题 但是
  • 将链接放入 console.log() 中。 Node.js

    我想做这样的事情 console log Your server available at a href localhost 3000 a 但不幸的是节点控制台无法识别 a 标签 有什么想法如何将链接放入节点控制台吗 您无法让终端解释 HT
  • -不再支持webkit-text-size-adjust,如何将font-size设置为小于12px

    当我将 chrome 更新为28 0 1500 11 开发 m 我找到 webkit text size adjust none 不再支持 我在这里找到了 changlisthttp trac webkit org changeset 14
  • 与 MySQL 电话号码数据库作斗争

    我的应用程序想要存储一个列表国际电话号码在 mysql 数据库中 然后应用程序需要查询数据库并搜索特定号码 听起来很简单 但实际上是一个很大的问题 因为用户可以以不同的格式搜索该号码 所以我们每次都必须对数据库进行完整扫描 例如 我们可能将
  • 开始浏览时发送的第一个数据包

    想象一下用户坐在一台连接以太网的电脑前 他打开了浏览器 他在地址栏中输入 www google com 并按回车键 现在告诉我以太网上出现的第一个数据包是什么 我在这里找到了这个问题 Socket编程和多线程面试题 https stacko
  • 如何使用 bash 从单独的文件中粘贴列?

    使用以下数据 cat date1 csv Bob 2013 06 03T17 18 07 James 2013 06 03T17 18 07 Kevin 2013 06 03T17 18 07 cat date2 csv 2012 12 0
  • haml 中的内联标签

    在html中 你可以做这样的事情 p Lorem ipsum dolor sit amet consectetur adipiscing elit Praesent eget aliquet odio Fusce id quam eu au
  • 删除 Azure Devops (VSTS) 中的 git fork 关系

    我通过分叉另一个项目创建了一个 Azure DevOps VSTS 项目 现在 每当我们克隆新项目时 您都会在控制台输出中获得对原始项目的引用 remote This repository is a fork Learn more at h
  • 我可以使用 SVN 或 Mercurial 仅提交部分代码吗?

    我通常使用 Tortoisesvn 但我一直在研究 Mercurial 因为它是一个分布式版本控制系统 在这两个系统中 我正在寻找一种工具 可以让我仅选择文件的一部分并提交它们 如果我现在想这样做 我必须复制到文件的临时版本 并仅保留我想要
  • 内容编码需要注意的事项:gzip

    我创建了一个托管在 S3 存储桶上的静态网站 我的资源文件 css 和 js 文件 已使用 gzip 缩小和压缩 文件名本身是file gz js or file gz css并交付时带有Content Encoding gzip head
  • 用“*”替换最后 4 个字符

    我有一个字符串 我需要用 符号替换该字符串的最后 4 个字符 谁能告诉我该怎么做 一种快速而简单的方法 public static String replaceLastFour String s int length s length Ch
  • MVC EF 将帖子类型和客户类型合二为一

    我有一个类型叫blogpost具有对类型的属性虚拟引用customer public virtual Customer Customer get set 在我的表格中 我发布了blogpost and customer数据到控制器 所有值均
  • Visual C++ 2010 在调试时拒绝显示 std::string 值。显示<错误指针>

    我有一种奇怪的感觉 就像这是最近出现的问题 并且发生在两台不同的计算机上 当我调试并尝试查看 STL 中的 std string 的值时 它显示为值 它说它的大小是15 容量是一些乱码的巨大数字 数组值本身都显示 CXX0030 错误 无法
  • 如何将 Rails 中的自定义环境设置为默认环境?

    i created通过添加新文件在我的 Rails 应用程序中自定义暂存环境config environments staging rb 与 一样config environments development rb然后添加数据库配置conf
  • Android Draw 9补丁工具:图外黑线是什么意思

    我尽力在谷歌和安卓中找到这个问题 也做了几次尝试和错误 但无法得到这个问题 我正在学习 Android 的 Draw Nine Patch 图像 我知道的一个基本原则是 您处理的任何图像都必须采用 png 格式 如果它已经是 9 png 那
  • 如何反转 WPF Storyboard 动画?

    我在 Expression Blend 4 中的图像上创建了 WPF Storyboard 动画 悬停时 图像逐渐模糊 当鼠标离开图像时 有什么方法可以撤消或反转故事板吗 我可以让它触发 Storyboard Remove 但这实际上不会向
  • laravel livewire,如何通过单击将id或数据传递给另一个组件

    我有两个组件 帖子 和 帖子 帖子 显示帖子 通过单击图像我想在另一个组件中显示单击帖子的数据 下面发布类和组件 组件视图 div class post foreach posts as post div h1 post gt name h
  • 如何在定义之间添加空行?

    我成功地将我的代码设置为 clang format 格式 就像 iIwant 一样 然而 有一点让我很困扰 我想要在结构 类 函数的定义之间以及函数的声明之间有一个空行 目前 在格式化时 clang format 会删除空行 从而使所有内容
  • Android:有没有办法禁用通知捆绑?

    我有一个应用程序 用户可以在其中收到有关他们需要做的事情的多个通知 用户可以选择使其中一些通知持久化 我通过调用NotificationCompat Builder setOngoing 来实现 至少在我的 Android 版本 Nouga
  • SQL 2016 - 将 XML 转换为 Json

    我正在尝试使用 SQL2016 中的 FOR JSON PATH 将 XML 列转换为 Json 但遇到一些问题 给定以下 XML 请注意 某些 Product 元素可能包含 Product 列表