虽然现在win服务器已经几乎不用了,但是网上看到2016开始原生支持json 还是想试试

建立一个表  id int , json varchar(2000)

json字段中输入数据 {"root":"1","arr":["sdas","112","asd"]}

{"root":"2","arr":["sdas","112","asd"]}

{"root":"3","arr":["sdas","112","asd"]}

{"root":"1","arr":["sdas","112","asd"]}

{"root":"3","arr":["sdas","112","asd"]}

一共5行

简单介绍下几个函数

JSON_VALUE    返回的是 json某个字段的值 必须是 值 而不能是对象,对象无法返回,好比以上表中的数据  “arr“ 后面的 数组对象是无法返回的

JSON_VALUE 只能返回一个标量值。如果有一组嵌套对象要提取,必须使用 JSON_QUERY 函数。

再强调一遍,应注意 JSON_VALUE 返回的是 NVARCHAR。因此,除非添加 CAST,否则将会为文本编制索引。

那么我们运用条件查询,查询json串

简单的:

select * FROM t2 where json_value(json,'$.root') = '1';

运用  json_value 来 指定值 其中  $.root  是json的path

关于path网上截取一段

declare @v nvarchar(500) ='
{"name":"test",
"obj":{"arr":[1,"ofao",3,4,5],
}
}' select json_value(@v,'$.obj.arr[0]')
这里返回 1
和一般的数组对象一样 从 0 开始计数

返回数组对象的json

select json_query(json,'$.arr') FROM t2 where json_value(json,'$.root') = '1';

数组对象的取值可以用 json_value 套 json_query

来复杂一点的:

select json_value(json_query(json,'$.arr'),'$[0]') FROM t2 where json_value(json_query(json,'$.arr'),'$[1]') = '112';

增删改

JSON_MODIFY ( expression , path , newValue )

DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'

PRINT @info

-- Update name

SET @info=JSON_MODIFY(@info,'$.name','Mike')

PRINT @info

-- Insert surname

SET @info=JSON_MODIFY(@info,'$.surname','Smith')

PRINT @info

-- Delete name

SET @info=JSON_MODIFY(@info,'$.name',NULL)

PRINT @info

-- Add skill   这里可以为数组对象增加值或者创建新的数组对象

SET @info=JSON_MODIFY(@info,'append $.skills','Azure')

PRINT @info

接着上面创建的表来一句

UPDATE t2 set json = JSON_MODIFY(json,'$.root','5')

json字段中 root 的 值 都更新了

普通的table转换成json

测试一下基本的,从查询结果里面构造一个json 的格式

create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int)

insert into t1 values ('张三',90,80),('李四',75,90),('王五',68,100)
select * from t1 select * from t1 for json auto --查询结果
ID name Chinese Math
----------- -------------------------------------------------- ----------- -----------
1 张三 90 80
2 李四 75 90
3 王五 68 100 --json 格式
[{"ID":1,"name":"张三","Chinese":90,"Math":80},{"ID":2,"name":"李四","Chinese":75,"Math":90},{"ID":3,"name":"王五","Chinese":68,"Math":100}]

这个是默认模式下面使用json的查询结果。是不是十分清晰

然后我们再接再厉,第二波是这样纸的。假如我们要继续搞有层级关系的。我们还可以这样写。比方说把成绩放在一个叫points 的节点里面, 也是可以分层的

select ID,
name,
Chinese as [Points.Chinese],
Math as [Points.Math]
from t1 for json path --结果json
[
{"ID":1,"name":"张三","Points":{"Chinese":90,"Math":80}},
{"ID":2,"name":"李四","Points":{"Chinese":75,"Math":90}},
{"ID":3,"name":"王五","Points":{"Chinese":68,"Math":100}}
]

他们的分数就放在了json 里面的,被一个point 包住了。

如果说我要在这个结果里面添加一个头来包住,当然,我可以使用每个列来个别名 [root.col] 来实现,然而就有点啰嗦了。所以我们可以使用这个root 的关键字来添加一个顶节点

select ID,
name,
Chinese as [Points.Chinese],
Math as [Points.Math]
from t1 for json path,root('root') --返回的json结果
{"root":[
{"ID":1,"name":"张三","Points":{"Chinese":90,"Math":80}}, {"ID":2,"name":"李四","Points":{"Chinese":75,"Math":90}},{"ID":3,"name":"王五","Points":{"Chinese":68,"Math":100}}]}
 

当然咯,查询嘛,录入数据总是难免遇到null值,在这方面,for json 是如何处理的呢? 我在测试表添加一条数据在来查询

insert into t1 values ('赵六',100,null)

select ID,
name,
Chinese as [Points.Chinese],
Math as [Points.Math]
from t1
where id in(3, 4)
for json auto --json的返回结果
[{"ID":3,"name":"王五","Points.Chinese":68,"Points.Math":100},{"ID":4,"name":"赵六","Points.Chinese":100}]

auto 模式下,如果是空值,将会忽略该属性。这样的话很容易就每一个集合返回的属性数量都不一来,这样不好看。所以应对这种情况,我们可以使用 incluede_null_values 关键字,即使是空值,也带出来

select ID,
name,
Chinese as [Points.Chinese],
Math as [Points.Math]
from t1
where id in(3, 4)
for json auto, include_null_values --json 的返回结果
[{"ID":3,"name":"王五","Points.Chinese":68,"Points.Math":100},{"ID":4,"name":"赵六","Points.Chinese":100,"Points.Math":null}]

使用了这个关键字,就可以把空值带出来,里面的值是Null 值

 

sql server 2016 JSON 学习笔记的更多相关文章

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

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

  2. sql server自定义函数学习笔记

    sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...

  3. SQL Server物化视图学习笔记

    一. 基本知识   摘抄自http://www.cnblogs.com/kissdodog/p/3385161.html SQL Server索引 - 索引(物化)视图 <第九篇> 索引视 ...

  4. 数据库(sql server 2000)—— 学习笔记1

    一.安装 安装程序一般都是四合一的,SQL Server 2000有四个版本:企业版.标准版.个人版.开发版,每个版本的对系统的要求各不相同. SQL Server 2000各版本 对 操作系统的要求 ...

  5. SQL SERVER 常用函数 学习笔记

    1.字符串截取.字符串转数字 --Server.8.30 select SUBSTRING('SqlServer_2008',4,6) as DB, CONVERT(float,SUBSTRING(' ...

  6. SQL Server 2016原生支持JSON

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

  7. SQL Server 2016新特性: 对JSON的支持

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

  8. 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF

    1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载  链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...

  9. 《SQL 反模式》 学习笔记

    第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...

随机推荐

  1. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  2. ios开发Base64编码以及加密相关学习

    一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...

  3. JS学习十四天----server端运行JS代码

    server端运行JS代码 话说,当今不在client使用JS代码才是稀罕事.因为web应用的体验越来越丰富,client用JS实现的逻辑也越来越多,这造成的结果就是某些差点儿一致的逻辑须要在clie ...

  4. pandas 时间序列分析(一)—— 基础

    0. 以时间作为序列的索引 >> from datetime import datetime >> dates = [datetime(2011, 1, i) for i in ...

  5. 五一巨献,问答有礼,105QB送给IT互联网界的劳动人民

    活动主题:五一巨献,问答有礼,105QB送给IT互联网界的劳动人民活动时间:4月30日晚上10点~5月2日晚上10点活动期数:第1期,20150401 奖品:105QB获奖人数:20人1~5:每人10 ...

  6. [Angular] Router outlet events

    For example, we have a component which just simply render router-outlet: import { Component } from ' ...

  7. 5.7-GTID复制搭建

    基本环境   Master Slave MySQL版本 MySQL-5.7.16-X86_64 MySQL-5.7.16-X86_64 IP 192.168.56.156 192.168.56.157 ...

  8. iOS app审核参考信息地址

    发件人:(苹果开发支持邮箱地址) 中国区电话:400-670-1855 chinadev<chinadev@asia.apple.com>   您好: 感谢您与 Apple 开发者计划支持 ...

  9. 【t073】&&【t015】魔法物品

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有两种类型的物品:普通物品和魔法物品.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值 ...

  10. 【Material Design视觉设计语言】开篇

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...