前言

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. Fiddler+proxifier解决抓取不到客户端接口的问题

    工作中偶尔会遇到Fiddler抓不到客户端接口问题,那么就要借助第三方工具proxifier来实现了: 下载地址: 原地址:链接: https://pan.baidu.com/s/1JPJ4cILEs ...

  2. 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.上传文件的API(input控 ...

  3. 微服务集成springsecurity实现认证

    module:auth 1.添加依赖:spring-cloud-starter-security与spring-cloud-starter-oauth2 2.配置WebSecurityConfig:注 ...

  4. Windows10 myeclipse 本地部署javaweb项目

    Windows10 myeclipse 本地部署javaweb项目 一,先在网上寻找相关的项目,自己研究学习之后,进行二次开发 原文地址https://www.cnblogs.com/wydyzcnc ...

  5. 腾达Tenda电力猫PA3的无线名称和密码

    趁着2023年的双11,买了一对腾达电力猫,毕竟在家里长距离使用这东西还是蛮方便的. =============================== 配置其实蛮简单的,配对嘛,就是两个都插上电,然后在 ...

  6. openAI的比赛retro contest的一些细节设置(Detail)

    2018年openAI公司搞了一个比赛retro contest,该比赛目的是为了在自家的库retro上测试迁移强化学习的性能,虽然这个比赛已经结束多年但是现在了解一些也是有一定益处的. 比赛细节介绍 ...

  7. git 如何在本地批量删除匹配名称分支

    背景 有时间创建了一大堆的dev/*分支,远程合并完就删除了,但本地还留下一大堆,自己又忘记删除了.一个个删除太麻烦.后面发现居然有批量删除的方法 备注:这里是window下powershell的命令 ...

  8. docker 常用工具

    windows 下常常需要linux环境 直接安装虚拟机不方便也浪费资源 所以直接在docker下安装一个centos 然后搭建好开发环境就是个不错的办法 一.Linux 环境 1.安装centos ...

  9. 神经网络之卷积篇:详解Padding

    详解Padding 为了构建深度神经网络,需要学会使用的一个基本的卷积操作就是padding,让来看看它是如何工作的. 如果用一个3×3的过滤器卷积一个6×6的图像,最后会得到一个4×4的输出,也就是 ...

  10. JavaScript设计模式样例二十二 —— 访问者模式

    访问者模式(Visitor Pattern) 定义:使用一个访问者类,改变元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.目的:将数据结构与数据操作分离.场景:您在朋友家做客, ...