SQL Server 中 JSON_MODIFY 的使用

Intro

SQL Server 从 2016 开始支持了一些 JSON操作,最近的项目里也是好多地方直接用字段直接存成了 JSON,需要了解一下怎么在SQL Server 中操作 JSON.

JSON支持适用于 SQL Server 2016 及以上版本 和 Azure SQL Database。

最近在项目中很多地方字段都是存一个 JSON 字符串,尤其是针对一些有很多不确定的属性的数据来说,这样的信息我们一般都放在一个 Extra 之类的字段保存一个 JSON 字符串,由于不确定性很大,很有可能会遇到要修改这个 JSON 字符串结构的问题,在修改 JSON 对象的某一个值和修改 JSON 的结构时都会用到 JSON_MODIFY,今天就来介绍一下 JSON_MODIFY 的使用

示例

直接来看示例:

-- JSON_MODIFY 测试
DECLARE @testJsonValue NVARCHAR(100) = N'{"name":"John","skills":["C#","SQL"]}';
PRINT @testJsonValue;
-- 使用 append 在数组中追加元素
PRINT JSON_MODIFY(@testJsonValue, 'append $.skills', 'Azure');
-- 无效用法,这样会把属性更新为字符串
PRINT JSON_MODIFY(@testJsonValue, '$.skills', '["C#","T-SQL","Azure"]');
-- 修改数组
PRINT JSON_MODIFY(@testJsonValue, '$.skills', JSON_QUERY('["C#","T-SQL","Azure"]'));
-- 修改数组某个元素
PRINT JSON_MODIFY(@testJsonValue, '$.skills[0]', 'CSharp');
-- 增加属性嵌套
PRINT JSON_MODIFY(@testJsonValue, '$.Likes', JSON_QUERY('{"Girl": "Alice"}'));
PRINT JSON_MODIFY(@testJsonValue, '$.Likes', JSON_QUERY('{"Animals": ["Dog","Cat"]}'));
-- 增加 bool 属性
PRINT JSON_MODIFY(@testJsonValue, '$.ShowAwardsAfterQuizEnds', CONVERT(BIT, 'false'));
PRINT JSON_MODIFY(@testJsonValue, '$.ShowAwardsAfterQuizEnds', CONVERT(BIT, 1));
-- 增加 int 属性
PRINT JSON_MODIFY(@testJsonValue, '$.TotalWinnersCount', CONVERT(INT, '20'));
PRINT JSON_MODIFY(@testJsonValue, '$.TotalWinnersCount', 20);
-- 删除属性
PRINT JSON_MODIFY(@testJsonValue, '$.name', NULL);

输出结果如下图:

More

注意:

  • 如果要更新的字段没有是一个 JSON 对象或是一个数组,那么需要使用 JSON_QUERY ,否则更新的对应的属性就成了字符串了。

  • 如果是要删除某一个属性,把某一个属性更新为 NULL 即可

  • 如果要增加一个 bool 类型的属性,需要把对应的值转换为 BIT 类型

Reference

  • https://docs.microsoft.com/en-us/sql/t-sql/functions/json-modify-transact-sql?view=sql-server-ver15

  • https://docs.microsoft.com/en-us/sql/relational-databases/json/json-path-expressions-sql-server?view=sql-server-ver15

SQL Server 中 JSON_MODIFY 的使用相关推荐

  1. modify sql_在SQL Server中使用JSON_MODIFY()修改JSON数据

    modify sql This article explores JSON_MODIFY() function to modify JSON Data in the SQL Server. 本文探讨了 ...

  2. SQL Server中Identity标识列

    SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便.但它有时还会带来一些麻烦. SQL Server中,经常会用到Identity标识列,这种自增长的字段 ...

  3. predicate 列存储索引扫描_在SQL SERVER中导致索引查找变成索引扫描的问题分析

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...

  4. mysql2008 limit,在SQL Server中实现 Limit m, n 的功能

    在SQL Server中实现 Limit m, n 的功能 (2012-03-14 18:17:43) 标签: 杂谈 在MySQL中,可以用 Limit 来查询第 m 列到第 n列的记录,例如: se ...

  5. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  6. 将Session值储存于SQL Server中

    一般情况下,我们喜欢使用Session储存我们的变量.Asp.Net提供了下面一些方法储存Session的值: InProc State Server SQL Server "InProc& ...

  7. 在SQL Server中保存和输出任意类型的文件

    我们可以把任意类型的文件保存到SQL Server中,在进行例子之前,先建立测试用表格,TestFile.sql: if exists (select * from dbo.sysobjects wh ...

  8. SQL SERVER中什么情况会导致索引查找变成索引扫描

    原文:SQL SERVER中什么情况会导致索引查找变成索引扫描 SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方 ...

  9. SQL Server中读取XML文件的简单做法

    SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦.本文介绍在SQL Server中读取XML文件的简单做法. ...

最新文章

  1. linux内核内存管理的三个阶段分析
  2. shutdown函数和FIN_WAIT2状态
  3. python中os.path.isdir()等函数的作用和用法
  4. 【转】学习Entity Framework 中的Code First
  5. 分布式MinIO快速入门 ​​​​​​​
  6. 自动化测试的概念及工具
  7. 【QT】Qaction和触发函数建立连接的方法
  8. nodejs注册为windows服务实现开机自启动
  9. 关于maven项目中的Missing artifact *.jar ...
  10. HashMap死循环讲解(JDK1.8 之前)
  11. 金山打字测试一分钟软件,金山打字2006——一款打字练习及测试软件.doc
  12. vim写python时:line 1: syntax error near unexpected token
  13. websocket错误码盘点
  14. 开源网络情报(OSINT)定义:对您的企业意味着什么
  15. 在img的图片上添加文字
  16. 多组输入与单组输入的区分
  17. matlab坐标位置灰色,MATLAB画图工具中坐标外面的底色是灰的,该如修改?
  18. 什么是内存泄露,如何避免内存泄露 C++
  19. win10的bat文件或者cmd文件关联了文本编辑器导致无法运行
  20. 格局决定结局,九种职场高效思维你都有吗

热门文章

  1. SQL Server 负载均衡集群(转)
  2. (译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分
  3. ASP.NET2.0_多语言本地化应用程序
  4. linux df命令功能,Linux df命令简要介绍
  5. 以当天日期时间,打包目录
  6. 《图解 HTTP》读书笔记(未完待续)
  7. onmouseover-onmouseout
  8. 安装程序无法创建新的系统分区也无法定位现有分区的解决方法
  9. 段落排版--行间距, 行高(line-height)
  10. thinkphp 3.2 unionall