前言

JSON 是一个很好的格式, array, object 就能表达一个表格了.

如果想保存一些结构格式, 又不想用表格这么大费周章的话, JSON 会是很好选择.

比如我用它来记入 Audit Trial, 每一个请求的 post data 直接记入到一个 column 里面.

SQL Server 是在 2016 版本开始支持 JSON 格式的.

之前写过一些小笔记

主要参考

JSON data in SQL Server

Index JSON data

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的更多相关文章

  1. SQL SERVER 数据导出JSON

    执行下面的存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE[dbo].[SerializeJSON]( @ ...

  2. SQL Server 2016 的JSON功能

    测试一下基本的,从查询结果里面构造一个json 的格式 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) ...

  3. SQL Server 2016原生支持JSON

    转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML ...

  4. .NET Core 1.1日期解析无APi、SQL Server数据转换JSON

    前言 在批量导入Excel中的数据时发现出生日期为整数也就是为天数,结果倒腾了翻,这是其一,其二是数据库中的某一列存的是JSON数据,但是场景是为了作为作业来运行,此时不得不将筛选出的数据手动拼接成J ...

  5. SQL Server2016 原生支持JSON

    SQL Server2016 原生支持JSON SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML 索引以及各种管理 XML 或输出 XML 格式的函数. ...

  6. SQL Server 2016最值得关注的10大新特性

    全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...

  7. SQL Server 中 `JSON_MODIFY` 的使用

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

  8. SQL Server 2016 JSON原生支持实例说明

    背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...

  9. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  10. ASP.NET用SQL Server中的数据来生成JSON字符串

    原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏] 摘要:ExtJs用到的数据内容基本 ...

随机推荐

  1. 咬文嚼图式的介绍二叉树、B树/B-树

    前言 因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达.对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详的词汇.对于一个数据结构而言,无非就是增删改 ...

  2. Java实现快速快速排序算法

    算法简介 快速排序(Quick Sort) 是由冒泡排序改进而得的.在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序.如果能通过两个(不相邻)记录的一次交换直接 ...

  3. oeasy 教您玩转linux 010303文件管理器 nautilus

    我们来回顾一下 上一部分我们都讲了什么? 讲了火狐 火狐的位置 用命令行打开多个网址 火狐的升级 火狐桌面建立快捷方式 我们可以知道桌面快捷方式文件的名称么? 从文件管理器到命令行 按住文件 拖动到t ...

  4. openGL之多线程渲染

    随着Vulkan的引入,我们的图形技术的发展到达了一个新的顶点,但是呢,我们的老干爹OpenGL作为落日余晖,他在一些Vulkan才有的新功能上,也提供了一些支持,现在我们来讨论一下OpenGL之多线 ...

  5. Windows版本免费PyMol的安装

    技术背景 在前面一篇博客中,我们介绍过在Linux平台下安装和使用免费版本的PyMol.其实同样的这个免费版在Windows平台上(这里以win11为例)也是支持的. 安装流程 这个免费版本的PyMo ...

  6. Linux 中 Crontab 执行时的环境变量问题(allure命令不执行)

    前几天做了UI自动化脚本部署linux服务器,但是放下脚本的allure命令不执行(生成allure报告和启动allure服务的命令不执行),然后就各种找问题,一开始怀疑是allure的环境变量问题, ...

  7. 【Vue】NPM构建的一些问题解决

    9418端口已经不再支持未授权的GIT协议 C:\Users\Administrator\Desktop\wss-taskcore-web>npm install npm ERR! Error ...

  8. 【SpringBoot】03 自动装配原理探索

    SpringBoot的依赖探索 首先是一个父级依赖管理的pom.xml [Ctrl + 左键点击]访问进去之后还有父级的父级 到最后才是我们的真正的顶级父类Pom.xml 我们当前的父级坐标 < ...

  9. 【JS】04 DOM 文档对象模型 P1 查找元素、改变内容、绑定事件

    什么是DOM? Document Object Model 文档指的是HTML文档 当浏览器打开一个网页的时候,实际上把HTML文档读取到内存中进行解析 整个HTML文档被封装为document文档对 ...

  10. 【Vue】Re21 VueX 第二部分(Mutations)

    一.Mutations携带参数处理 Store状态的更新唯一方式:提交Mutations Mutations包含两部分: 1.字符串的事件类型[TYPE] 2.一个回调函数[HANDLER] 该函数的 ...