SQL Server 2016原生支持JSON
转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html
SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型、XML 索引以及各种管理 XML 或输出 XML 格式的函数。
在 SQL Server 时隔 4 个主要版本之后,终于在 Microsoft Ignite 2015 大会上正式宣布,新一代的 SQL Server 2016 正式支持现在最流行的数据交换格式— JSON(JavaScript Object Notation)。
SQL Server 2016 对JSON的支持并不是增加一个JSON数据类型,而是提供一个更轻便的框架,帮助用户在数据库里处理JSON格式数据。
用户不需要更变现有的表结构,因为SQL Server使用NVARCHAR 数据类型来存储JSON文件,并且跟现有技术相互兼容,比如全文搜索、列存储索引、in-memory OLTP,应用程序不需要做任何修改
不需要使用JSON.Net这类工具分析和处理JSON数据,利用SQL Server内置函数就可以处理JSON数据,轻松将查询结构输出为JSON格式,或者搜索JSON文件内容。
使用 JSON AUTO 输出JSON 格式
要将select语句的结果以JSON输出,最简单的方法是在后面加上 FOR JSON AUTO
测试版本
Microsoft SQL Server 2016 (CTP2.2) - 13.0.407.1 (X64) Jul 22 2015 21:19:11 Copyright (c) Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9
600: ) (Hypervisor)
SELECT * FROM [dbo].[Client]
GO SELECT * FROM [dbo].[Client] FOR JSON AUTO
GO
我们可以把每列中显示的最大字符数 设置为8192

加上Root Key
如果想为FOR JSON 加上Root Key,可以使用ROOT选项来指定 Root Key 名称
SELECT * FROM [dbo].[Client] FOR JSON AUTO,ROOT('SUSU')
GO

使用JSON PATH 输出JSON格式
当想要自定义输出JSON格式结构的时候,必须用JSON PATH描述,若SELECT 的字段名称相同,必须用别名方式来重新命名字段名这样才可以继续查询
另外,如果字段的默认值为NULL,那么输出JSON时,JSON会忽略null的只。如果要显示null值,可以加上INCLUDE_NULL_VALUES 选项(同样适用于JSON AUTO字句)
select * from [dbo].[Client] --FOR JSON PATH
SELECT * FROM [dbo].[Client] WHERE ClientID =2
FOR JSON PATH [{"ClientID":2,"Firstname":"Peter","Lastname":"Nielsen","Birthdate":"1998-05-19T00:00:00","Email":"Peter@126.com","PhoneNumber":"+86-16326269674","Birthplace":"Stockholm","SocialSecurityNumber":"1901531234"}] --FOR JSON PATH
SELECT * FROM [dbo].[Client] WHERE ClientID =4
FOR JSON PATH,INCLUDE_NULL_VALUES [{"ClientID":4,"Firstname":"kade","Lastname":null,"Birthdate":"1980-01-06T00:00:00","Email":"Lotte@SOHU.com","PhoneNumber":"+86-16326269674","Birthplace":"Aalborg","SocialSecurityNumber":"1061234"}]

更多关于JSON的功能
目前SQL Server 2016 CTP2 对于JSON的功能支持还是比较有限,例如内置处理JSON格式化的函数,
ISJSON(判断是否是JSON格式)、JSON_VALUE(分析JSON文件并提取出值) 、OPENJSON(将JSON文件转换为普通数据表)
这些功能要等到CTP3才能陆续推出
在数据库层对JSON提供支持,是请求排名最靠前的特性之一,在Microsoft Connect网站上对他的投票量超过了1000。微软承诺,在Sql Server 2016版本中,会提供内置的JSON支持。注意这并不是Sql Server 2005已有特性XML原生支持的翻版。微软的目标是创建一个简单好用的框架来处理JSON文档。本文中,我将描述SQL Server 2016中计划实现的JSON特性。特性支持时间表如下:
- SQL Server 2016 CTP2 - 能够把数据格式化为JSON导出,关于该特性的详细信息情参阅博文。
- SQL Server 2016 CTP3 - 能够加载JSON字符串并解析为表变量,能够提取JSON节点的值,对JSON列设置索引属性。
JSON 数据的存储形式
首先我们要搞明白的是,内置JSON支持并不等于原生JSON类型。在SQL Server 2016中,JSON数据将会使用NVARCHAR类型存储,原因如下:
- 可迁移性 - 我们发现人们已经开始使用字符串来表示JSON数据,如果引入新的JSON类型,人们不得不改变数据库架构,并且使用新的特性来重新载入数据。
- 特性兼容性 - NVARCHAR数据类型已经被SQL Server的各个组件广泛支持,这样JSON也就被这些组件支持。你可以把JSON放进Hekaton,Temporal或者column store表中,应用行级别的权限控制等安全策略,使用B-Tree和FTS索引,把JSON作为存储过程或用户自定义函数的参数与返回值等。你无需考虑JSON是否与某个特性X兼容,因为只要NVARCHAR与特性X兼容,那么JSON也就兼容。此外也有一些限制,由于Hekaton和column store不支持LOB值,因此你职能保存小型JSON文档,但是,一旦我们为Hekaton和column store添加了对LOB的支持那么你就能够把JSON文档存储在任意地方了。
- 客户端代码兼容性 - 当前在客户端应用中我们还没有标准的JSON对象类型(向XmlDom对象)。网页、移动端和JavaScript应用使用内置的解析器把JSON文本转化为对象。在JavaScript中使用object来表示JSON数据,不可能为少数关系型数据库内建JSON 类型提供一个代理类型。在C#.Net中,大量开发者使用JSON.net解析器和内建的JObject、JArray类型;但是这些不是标准方案,且可能不会被纳入ADO.NET,所以C#应用从数据库得到纯文本JSON后使用自己喜欢的解析器进行处理。
注意你仍然可以使用自己的能通过CLR实现的JSON类型,引入JSON.NET或其他相似的库。即使你不喜欢编码实现CLR用户自定义类型,也可以下载大量现成的实现,这样你不需要注意原生JSON类型和用户自定义JSON类型之间的差异。只要对于大多数.Net应用来说足够快就可以了。如果你觉得PostgreSQL的JSONB格式或则zipped JSON text等压缩格式更好,那么你可以通过UDT来使用他们, 可以创建成员方法来利用那种格式的属性。当前我们还没有发现有谁在尝试使用UDT来封装JSONB格式,因此,在Sql Server 2016中不考虑JSONB格式。
我们的焦点在于提供更好的函数和更优的查询性能,而不在于节约存储空间。我们知道在PostgreSQL中有原生JSON类型和对JSONB的支持,但是我们不确定其性能与CLR方式相比是否更有优势,所以,在SQL Server 2016中,我们决定关注于其他更重要的方面(你希望看到在SQL Server中有原生的JSON类却没有相关的内建函数吗?我想答案是否定的)。但是,我们会在社区中与大家讨论,是否大家认为使用原生的JSON类型比CRL JSON或则文本JSON更好,你可以在Microsoft Connect网站上创建话题与我们讨论。我们决定首先实现FOR JSON和OPENJSON还由于该特性是大量用户都需要的,并且通过CLR难以实现。
因此,我们的关注重点是导出/导入遗迹一些内建的JSON处理函数。有人可能会说这些函数的性能还不够快。我们的策略是先提供一个可用的实现,再来持续优化其性能。但是,在数据库层内建JSON解析器时处理JSON最快的手段。你可以使用CRL类型或者CLR解析器作为外部库但是它的性能不会比原生代码解析JSON更快。
SQL Server 2016原生支持JSON的更多相关文章
- SQL Server2016 原生支持JSON
SQL Server2016 原生支持JSON SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML 索引以及各种管理 XML 或输出 XML 格式的函数. ...
- 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF
1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载 链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...
- SQL Server 2016新特性: 对JSON的支持
SQL Server 2005开始支持XML数据类型,提供原生的XML数据类型.XML索引及各种管理或输出XML格式的函数.随着JSON的流行,SQL Server2016开始支持JSON数据类 ...
- sql server 2016 JSON 学习笔记
虽然现在win服务器已经几乎不用了,但是网上看到2016开始原生支持json 还是想试试 建立一个表 id int , json varchar(2000) json字段中输入数据 {"r ...
- SQL Server 2016 CTP2.2 的关键特性
SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship Database(突破性的旗舰级数据库 ...
- SQL Server 2016最值得关注的10大新特性
全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...
- SQL Server 2016 特性和安装方法
SQL Server 2016 特性: 全程加密技术(Always Encrypted),动态数据屏蔽(Dynamic Data Masking),JSON支持,多TempDB数据库文件,PolyBa ...
- SQL Server 2016 ->> T-SQL新特性
1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 ) ) ON [myPS1](PrtCol) ...
- 微软发布正式版SQL Server 2016
微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...
随机推荐
- 李洪强iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...
- RedMine项目管理系统安装问题(Windows版一键安装包)
安装准备: 操作环境:VMware10 下安装的windows10 系统 使用软件:<bitnami-redmine---windows-installer.exe> 问题描述: 安装过程 ...
- 安装Hadoop系列 — 安装Eclipse
1.下载 Eclipse从 http://www.eclipse.org/downloads/index-developer.php下载合适版本,如:Eclipse IDE for C/C++ Dev ...
- SQLite支持的SQL数据操作
事务处理 Posted on 2013 年 1 月 1 日 by 林溪 事务为一组SQL命令的集合,这些SQL命令在执行时不可进行分割,即要么全部执行这些SQL命令,要么一个都不进行执行,事务操作 ...
- Notepad++加上xml格式化的功能
工作中需要用代码创建一个XML文件,创建完发现XML内容都处在同一行,导致非常不容易查看清楚XML代码.于是习惯性地用 Notepad++查看,想用它来对XML代码格式化一下. 于是找到了TextFX ...
- log4j学习一:解决系统日志错位问题
这两天,开发的系统遇到了一个非常奇怪的问题,我们的前台程序会将日志时而输出到webapp.log,时而输出到其他日志文件如AlarmThreshold.log中,初看并无规律,但秉着“机器永远不会出错 ...
- JQuery安全分析
JQuery安全分析: JQuery的风险均来源于对输入的数据没有进行有效性检验.客户端的Javascript需要检验:来源于服务器的数据.来源于当前页面的用户输入,服务器端需要检验来源于用户端的数据 ...
- Asp.net mvc中整合autofac
创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofa ...
- EF的表连接方法Include() - nlh774
在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同. 例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外 ...
- Button 自定义(一)-shape
需求:自定义Button,使用系统自定义Shape: 效果图: 1.默认状态 2.选中状态 实现分析: 1.目录结构: 代码实现: 1.button_normal.xml <?xml versi ...