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用到的数据内容基本 ...
随机推荐
- 引入样式在Element UI (Vue 2)和Element Plus (Vue 3)中的不同
引入样式 Element UI (Vue 2): import 'element-ui/lib/theme-chalk/index.css'; Element Plus (Vue 3): im ...
- [oeasy]python0074_修改字体背景颜色_background_color_背景色
修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...
- PowerShell 基本使用
PowerShell Basic PowerShell Basic 简要 基本使用 PowerShell cmdlet 获取帮助 PowerShell 别名和参数 编写一个 PowerShell 脚本 ...
- 后端说,单页面SPA和前端路由是怎么回事
没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新.但开始单页面开发后,就完全不同了. 单页面?这个概念难以理解.我用一个js作为整个we ...
- Jmeter函数助手4-RandomDate
RandomDate函数用于生成一段时间范围内的随机日期(年月日). Format string for DateTimeFormatter (optional) (default yyyy-MM-d ...
- 图床、云对象存储、CDN业务:“自定义 CDN 加速域名” 与 “自定义源站域名” 的区别
参考: https://developer.qiniu.com/kodo/8622/dev-the-binding-source-domain-name ----------------------- ...
- [USACO09JAN] Safe Travel G 题解
UPDATE on 2024.5.10 删去左偏树代码中令人误解的 fa 数组. 前话 题目链接:洛谷. 貌似别人都是使用并查集维护的方法,然而由于排序.最短路等算法瓶颈,以下令 \(n\) 和 \( ...
- 日均调度 10W+ 任务实例,DolphinScheduler 在蔚来汽车一站式数据治理开发平台的应用改造
大家好我是张金明,在蔚来汽车担任大数据平台研发工程师.这次和大家分享的是 Apache DolphinScheduler 在蔚来汽车一站式数据治理开发平台的应用和改造,接下来我将从背景.应用现状和技术 ...
- 什么是ARM中的SP(堆栈)和LR?
LR是用于保存函数调用的返回地址的link register. SP是堆栈指针.堆栈通常用于在函数调用中保存"automatic"变量和上下文/参数.从概念上讲,您可以将" ...
- SRE 必备知识 - Kafka 探秘之零拷贝技术
如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化. 零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝. 在 K ...