前言

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. django 中的collectstatic

    django 中的collectstatic 在Django中,"collectstatic"是一个管理命令,用于收集和复制项目中的静态文件到一个指定的静态文件目录,以便于部署. ...

  2. 图的存储、创建、遍历、求最小生成树、最短路径(Java)

    带权无向图 存储结构 存储结构选用邻接表. 当一个图为稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费. 当然,即使我们所处理的 ...

  3. [oeasy]python0023_[趣味拓展]Guido的简历_从ABC到python

    Guido的简历 回忆上次内容 上次 添加了 各种 符号 铭文 各种 颜色 铸造了 自己的宝剑       添加图片注释,不超过 140 字(可选)   这些都是 用python画出来的宝剑   py ...

  4. [oeasy]python0048_注释_comment_设置默认编码格式

    注释Comment 回忆上次内容 使用了版本控制 git 制作备份 进行回滚   尝试了 嵌套的控制结构 层层 控制   不过 除非 到不得以 尽量不要 太多层次的嵌套   这样 从顶到底 含义 明确 ...

  5. [oeasy]python0068_ 字体样式_正常_加亮_变暗_控制序列

    字体样式 回忆上次内容 上次了解了一个新的转义模式 \33 逃逸控制字符 esc esc 让输出 退出标准输出流 进行控制信息的设置 可以清屏 也可以设置光标输出的位置 还能做什么呢? 可以设置字符的 ...

  6. 题解:P10608 双人游戏

    题解:P10608 双人游戏 题意 给予你一个长度为 \(n\) 的字符串 \(c\),\(c\) 上有三种颜色的棋子,其中有 \(m\) 个空字符. 接下来有 \(m\) 个操作,每个操作意味小 M ...

  7. 假期小结7爬虫学习requests

    这周我初步学习了py爬虫的相关知识,以下是我的部分总结 URL headers(URL头部)是HTTP请求中包含的一部分信息,用于描述.控制和传递请求的各种元数据.它们是位于HTTP请求消息的起始部分 ...

  8. C# 推荐一种开机自启动的方式

    概述(Overview) 网上多数搜索结果以注册表设置为优先,这个方法需要管理员权限,实际工作中可能并不适用.这个方法是直接写到用户开机自启动目录里,系统开机会带着一起启动.(Most search ...

  9. Jmeter函数助手10-regexFunction

    regexFunction函数用于对上一个请求进行正则表达式提取处理,类似正则表达式. 用于从前一个请求搜索结果的正则表达式:填入正则表达式 Template for the replacement ...

  10. 【TypeScript】02 面向对象

    [联合类型] 联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值. 注意:只能赋值指定的类型,如果赋值其它类型就会报错. var val:strin ...