转载原地址: 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的更多相关文章

  1. SQL Server2016 原生支持JSON

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

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

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

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

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

  4. sql server 2016 JSON 学习笔记

    虽然现在win服务器已经几乎不用了,但是网上看到2016开始原生支持json 还是想试试 建立一个表  id int , json varchar(2000) json字段中输入数据 {"r ...

  5. SQL Server 2016 CTP2.2 的关键特性

    SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库 ...

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

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

  7. SQL Server 2016 特性和安装方法

    SQL Server 2016 特性: 全程加密技术(Always Encrypted),动态数据屏蔽(Dynamic Data Masking),JSON支持,多TempDB数据库文件,PolyBa ...

  8. SQL Server 2016 ->> T-SQL新特性

    1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 ) ) ON [myPS1](PrtCol) ...

  9. 微软发布正式版SQL Server 2016

    微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...

随机推荐

  1. POJ 3904 Sky Code

    题意:给定n个数ai, ai <= 10000, n <= 10000, 从中选出4个数要求gcd为1,这样的集合有多少个? 分析:首先总共集合nCr(n, 4) = n*(n-1)*(n ...

  2. codeforces #305 B Mike and Feet

    跟之前做过的51Nod的移数博弈是一样的QAQ 我们考虑每个数的贡献 定义其左边第一个比他小的数的位置为L 定义其右边第一个比他小的数的位置为R 这个可以用排序+链表 或者 单调队列 搞定 那么对于区 ...

  3. Nginx-location配置指南

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

  4. hdu4745Two Rabbits(dp)

    链接 哎..比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理.. 观看了众多神牛的代码 ..以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的...现在觉得好 ...

  5. mysql运算符的优先级

    Operator precedences are shown in the following list, from highest precedence to the lowest. Operato ...

  6. Shell Script Tutorials (0 ~ 62)

    Tutorial-1: Introduction Tutorial-2: Shell, Kernel, Terminal & More Tutorial-3: View System Date ...

  7. asp.net(vs2005) + Sql2000 缓存依赖

    1.开启数据库缓存依赖支持 开始,运行,cmd 输入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql -S localhost ...

  8. windows 远程桌面连接 RPi 2B

    /************************************************************************* * windows 远程桌面连接 RPi 2B * ...

  9. hdu 3367 Pseudoforest

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  10. MAC虚拟机NAT方式共享上网设置

    有部分FY需要,我写一下我的方法吧,当初安装完MAC后,无法上网,网络搜索用的是HOST-only方法,试了几次都没有成功,后来尝试NAT方法,发现很简单. 我的主机系统:win7 64位,自动获取I ...