SQL Server – Work with JSON
前言
JSON 是一个很好的格式, array, object 就能表达一个表格了.
如果想保存一些结构格式, 又不想用表格这么大费周章的话, JSON 会是很好选择.
比如我用它来记入 Audit Trial, 每一个请求的 post data 直接记入到一个 column 里面.
SQL Server 是在 2016 版本开始支持 JSON 格式的.
之前写过一些小笔记
主要参考
Format Query Results as JSON with FOR JSON (SQL Server)
YouTube – Deep dive: Using JSON with SQL Server (必看)
实战
创建 JSON Column
CREATE TABLE TestJson
(
Id int IDENTITY CONSTRAINT PK_TestJson_Id PRIMARY KEY,
JsonData nvarchar(max) CONSTRAINT [Content should be formatted as JSON] CHECK(ISJSON(JsonData)>0)
);
Json Column 其实就是 nvarchar 来的, 只是在上面加了一层 constraint 而已. ISJSON 是一个判断 text 是不是 JSON 的方法.
进资料
没什么特别的, 进 string 就可以了
INSERT INTO TestJson (JsonData) VALUES
('{ "name": "Derrick", "age": 11, "good": true }'),
('{ "name": "Keatkeat", "age": 12, "good": false }');
OPENJSON
除了搞 table 还有一种简单的方式
DECLARE @json NVARCHAR(MAX) = N'[
{
"name": "Derrick1"
},
{
"name": "Derrick2"
}
]';
SELECT * FROM OPENJSON(@json);
result

OPENJSON 顾名思义, 就是把 JSON string 变成 table
然后就可以通过 JSON_VALUE(value, '$.name') 获取到 Derrick1.
value 是 column name 来的. (JSON_VALUE 的用法下面会教)
在一个例子
DECLARE @json NVARCHAR(MAX) = N'{
"products": [
{
"name": "Derrick"
},
{
"name": "Derrick"
}
]
}';
我们拿 products 的 array 作为 table
SELECT * FROM OPENJSON(@json, '$.products');
$.products 就是获取 array 的路径
JSON_VALUE & JSON_QUERY
JSON_VALUE
SELECT
JSON_VALUE(JsonData, '$.name')as [Name],
JSON_VALUE(JsonData, '$.age') as Age,
CAST(JSON_VALUE(JsonData, '$.good') as bit) as Good,
* FROM TestJson
WHERE JSON_VALUE(JsonData, '$.good') = 'true'
ORDER BY JSON_VALUE(JsonData, '$.name');
or

DECLARE @json NVARCHAR(MAX) = N'[
{
"name": "Derrick1",
"age": 1,
"good": true
},
{
"name": "Derrick1",
"age": 1,
"good": false
}
]'; SELECT
JSON_VALUE(value, '$.name')as [Name],
JSON_VALUE(value, '$.age') as Age,
CAST(JSON_VALUE(value, '$.good') as bit) as Good FROM OPENJSON(@json)
WHERE JSON_VALUE(value, '$.good') = 'true'
ORDER BY JSON_VALUE(value, '$.name');
通过 JSON_VALUE 这个方法可以获取到对象属性值, 然后就可以当成普通 column 值来处理了.
注: boolean 被 parse 出来是 nvarchar 哦, 可以通过 cast 换成 bit. number parse 出来时 int, 这个是对的.
但是 JSON_VALUE 无法处理 Array 和 Object 哦
DECLARE @json NVARCHAR(MAX) = N'[
{
"array": ["value1", "value2", "value3"],
"obj": {
"name": "Derrick"
}
}
]'; SELECT
JSON_VALUE(value, '$.array'), --null
JSON_VALUE(value, '$.obj'), --null
JSON_VALUE(value, '$.obj.name'), --Derrick
JSON_VALUE(value, '$.array[0]') --value1
FROM OPENJSON(@json);
如果最终值不是值类型, 那么就会输出 null.
JSON_QUERY
JSON_VALUE 无法输出 Object 和 Array, 而 JSON_QUERY 就可以.
JSON_QUERY(value, '$.array'), --not null anymore
JSON_QUERY(value, '$.obj'), --not null anymore
result

where JSON Array contains value
DECLARE @json NVARCHAR(MAX) = N'[
{
"array": ["value1", "value2", "value3"],
"obj": {
"name": "Derrick"
}
},
{
"array": ["value2", "value3"],
"obj": {
"name": "Derrick"
}
}
]'; SELECT * FROM OPENJSON(@json) WHERE (
SELECT COUNT(*) FROM OPENJSON(JSON_QUERY([value], '$.array')) WHERE [value] = 'value1'
) > 0;
运用了 JSON_QUERY 和 OPENJSON
不一定要使用子查询, 用 cross apply 也可以
Update
UPDATE TestJson SET JsonData = JSON_MODIFY(JsonData, '$.age', 100);
通过 JSON_MODIFY 就可以修改 JSON 内容了, 它会返回一个 JSON string, 有一种 immutable 的 feel...
如果要同时修改多个属性值也非常简单
UPDATE TestJson SET JsonData = JSON_MODIFY(JSON_MODIFY(JsonData, '$.age', 100), '$.good', 'false') ;
只要嵌套一下就可以了哦....
JSON Index
JSON 要 filter, orderby 快的话, 做法是通过 computed column 或者是索引来优化.
具体看这篇, 我就不写了.
Format to Json
把 query result serialize to json

FOR JSON AUTO
SELECT [Name], Sku, Price FROM Product FOR JSON AUTO, INCLUDE_NULL_VALUES;
result
[{"Name":"Product A","Sku":"SKU-1","Price":10},{"Name":"Product B","Sku":"SKU-2","Price":20}]
INCLUDE_NULL_VALUES 表示, 即使 value is null 也要输出 property. 默认 SQL Server 是不输出的 null 的哦
ROOT
SELECT [Name], Sku, Price FROM Product FOR JSON AUTO, ROOT('products'), INCLUDE_NULL_VALUES;
result
{"products":[{"Name":"Product A","Sku":"SKU-1","Price":10},{"Name":"Product B","Sku":"SKU-2","Price":20}]}
root 的作用是输出一个 wrapper
WITHOUT_ARRAY_WRAPPER
SELECT TOP 1 [Name], Sku, Price FROM Product FOR JSON AUTO, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER;
result
{"Name":"Product A","Sku":"SKU-1","Price":10}
默认情况 result 一定是 starts with bracket []. 如果我们确信输出的只有 1 个 value, 那么可以把 array bracket 去掉.
FOR JSON PATH
SELECT TOP 1 [Name] AS [Key.Name], SKU AS [Key.SKU], Price FROM Product FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER;
通过 [Key.Name], [Key.SKU] 可以把 2 个属性 wrap 起来
result
{"Key":{"Name":"Product A","SKU":"SKU-1"},"Price":10}
SQL Server – Work with JSON的更多相关文章
- SQL SERVER 数据导出JSON
执行下面的存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE[dbo].[SerializeJSON]( @ ...
- SQL Server 2016 的JSON功能
测试一下基本的,从查询结果里面构造一个json 的格式 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) ...
- SQL Server 2016原生支持JSON
转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML ...
- .NET Core 1.1日期解析无APi、SQL Server数据转换JSON
前言 在批量导入Excel中的数据时发现出生日期为整数也就是为天数,结果倒腾了翻,这是其一,其二是数据库中的某一列存的是JSON数据,但是场景是为了作为作业来运行,此时不得不将筛选出的数据手动拼接成J ...
- SQL Server2016 原生支持JSON
SQL Server2016 原生支持JSON SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML 索引以及各种管理 XML 或输出 XML 格式的函数. ...
- SQL Server 2016最值得关注的10大新特性
全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...
- SQL Server 中 `JSON_MODIFY` 的使用
SQL Server 中 JSON_MODIFY 的使用 Intro SQL Server 从 2016 开始支持了一些 JSON操作,最近的项目里也是好多地方直接用字段直接存成了 JSON,需要了解 ...
- SQL Server 2016 JSON原生支持实例说明
背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- ASP.NET用SQL Server中的数据来生成JSON字符串
原文引自: 作者: 缺水的海豚 来源: 博客园 发布时间: 2010-09-21 21:47 阅读: 6136 次 推荐: 0 原文链接 [收藏] 摘要:ExtJs用到的数据内容基本 ...
随机推荐
- Mysql密码安全策略修改
Mysql5.7默认有密码安全策略,密码安全级别要求比较高,在测试环境中使用起来不方便,本经验将介绍如何修改Mysql的密码安全策略,解决ERROR 1819错误. 1:首先使用root用户连接mys ...
- linux date格式化获取时间
转载请注明出处: 在编写shell脚本时,需要在shell脚本中格式化时间,特此整理下date命令相关参数的应用 root@controller1:~# date --help 用法:date [选项 ...
- Win10下安装LabelImg以及使用--LabelImg
labelImg是图片标注软件,用于数据集的制作.标注等等.下面介绍labelImg的安装过程. 我用的是anaconda,所以以anaconda prompt作为终端: 在Anaconda Prom ...
- Python 实现Excel和TXT文本格式之间的相互转换
Excel是一种具有强大的数据处理和图表制作功能的电子表格文件,而TXT则是一种简单通用.易于编辑的纯文本文件.将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存,方便其他程序读取和 ...
- java开发,入职第一天都干什么,带提前了解
2024.7.24,帝都今晚大雨,在雨声磅礴的夜晚适合干什么,没错适合敲代码,写博客,今晚来聊下入职一个新公司,第一天都干什么. 无论是刚毕业的新手小白,还是工作十余年的职场老人,入职一家新公司,只要 ...
- 是否可以在线创建ios证书
生成苹果证书,假如使用官方的教程去生成,非常麻烦,因为它需要使用苹果mac电脑去生成,而且生成的流程还要对苹果电脑的证书导入和导出比较熟. 因此,生成苹果ios证书,不建议使用官方的方法去生成,少走弯 ...
- 【Mybatis-Plus】05 条件构造器 ConditionConstructor
理解: 原来叫条件构造器,我一直以为都是封装条件对象 即SQL的查询条件,不过都一样. 其目的是因为的实际的需求灵活多变,而我们的SQL的筛选条件也需要跟着变化, 但是有一些固定的字段固定的方式可以保 ...
- 使用 addRouteMiddleware 动态添加中间
title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要:文章 ...
- 植物大战僵尸杂交版v2.1整合包全解锁+高清工具
植物大战僵尸杂交版v2.1整合包全解锁+高清工具 引言 <植物大战僵尸>作为一款经典的塔防游戏,自2009年发布以来,就以其独特的游戏机制和幽默的风格赢得了全球玩家的喜爱.随着游戏的不 ...
- 老版本mujoco: mujoco 1.31 1.40 1.50 2.00 版本下载地址
下载地址: https://www.roboti.us/download.html 激活码下载地址: https://www.roboti.us/file/mjkey.txt 安装教程: https: ...