SQL Server 对JSON的支持

JSON 2016-08-22 18:36:59 13483

SQL Server 2016有望提供JSON操作原生支持。这一支持的首次迭代将作为SQL Server 2016 CTP 2的一部分发布。CTP又名社区技术预览版,等同于微软的公开Alpha测试,期间,开发者可以提出技术上的修改建议。

原文链接:http://www.infoq.com/news/2015/05/SQL-Server-JSON

JSON导出

“格式化和导出”JSON是CTP 2的主要功能。这可以通过在SELECT语句的末尾增加FOR JSON子句实现。该功能基于FOR XML子句,并且与它类似,允许对结果JSON字符串进行自动和半手工格式化。

微软希望这一语法可以提供与PostgreSQL的row_to_json和json_object函数相同的功能。

JSON转换

大部分功能将在CTP 3中发布。这些功能中的第一项是FROM OPENJSON子句,这是一个表值函数(TFV),它接受一个JSON字符串作为输入。它还需要一个数组或对象在被解析的JSON数据中的路径。

默认情况下,OPENJSON返回一个键值对集合,但开发者可以使用WITH子句提供一个模式。由于JSON不支持日期或整数(它们分别表示为字符串和double类型),所以WITH子句可以减少稍后需要的类型转换数量。

下面是JSON Support in SQL Server 2016 的Demo:

DECLARE @JSalestOrderDetails nVarCar(2000) = N '{"OrdersArray": [

{"Number":1, "Date": "8/10/2012", "Customer": "Adventure works", "Quantity": 1200},

{"Number":4, "Date": "5/11/2012", "Customer": "Adventure works", "Quantity": 100},

{"Number":6, "Date": "1/3/2012", "Customer": "Adventure works", "Quantity": 250},

{"Number":8, "Date": "12/7/2012", "Customer": "Adventure works", "Quantity": 2200}

]}';
SELECT Number, Customer, Date, Quantity

FROM OPENJSON (@JSalestOrderDetails, '$.OrdersArray')

WITH (

Number varchar(200),

Date datetime,

Customer varchar(200),

Quantity int

) AS OrdersArray

微软宣称,在PostgrSQL中实现同样的功能需要综合使用json_each、json_object_keys、json_populate_record和json_populate_recordset函数。

JSON存储

正如所见,JSON数据存储在NVARCHAR变量中。在表的列中存储JSON数据也是这样。关于为什么这么做,微软有如下理由:

  1. 迁移——我们发现,人们早已将JSON存储为文本,因此,如果我们引入一种单独的JSON类型,那么为了使用我们的新特性,他们将需要修改数据库模式,并重新加载数据。而采用现在这种实现方式,开发者不需要对数据库做任何修改就可以使用JSON功能。
  2. 跨功能的兼容性——所有SQL Server组件均支持NVARCHAR,因此,JSON也将在所有的组件中得到支持。开发者可以将JSON存储在Hekaton、时态表或列存储表中, 运用包括行级安全在内的标准安全策略,使用标准B树索引和FTS索引,使用JSON作为参数或返回过程值,等等。开发者不需要考虑功能X是否支持JSON ——如果功能X支持NVARCHAR,那么它也支持JSON。此外,该特性有一些约束——Hekaton及列存储不支持LOB值,所以开发者只能存储小 JSON文档。不过,一旦我们在Hekaton及列存储中增加了LOB支持,那么开发者就可以在任何地方存储大JSON文档了。
  3. 客户端支持——目前,我们没有为客户端应用程序提供标准JSON对象类型(类似XmlDom对象的东西)。自然地,Web和移动应用程序以及 JavaScript客户端将使用JSON文本,并使用本地解析器解析它。在JavaScript中,可以使用object类型表示JSON。我们不太可 能实现一些仅在少数RDBMS中存在的JSON类型代理。在C#.Net中,许多开发者使用内置了JObject或JArray类型的 JSON.Net解析器;不过,那不是一种标准,也不太可能成为ADO.NET的一部分。即便如此,我们认为,C#应用可以接受来自数据库层的纯字符串, 并使用最喜欢的解析器解析它。我们所谈论的内容不只是跟应用程序有关。如果开发者试图在SSIS/SSRS、Tableau和Informatica ETL中使用JSON列,它们会将其视为文本。我们认为,即使我们增加了JSON类型,在SQL Server之外,它仍将被表示成字符串,并根据需要使用某个自定义的解析器解析它。因此,我们并没有找到任何重大的理由将其实现为一种原生JSON类 型。

在包含JSON的NVARCHAR列上使用新的ISJSON函数作为检查约束是个不错的主意。如果不这样做,那么有缺陷的客户端应用程序就可能插入不可解析的字符串,使开发者面临数据污染的风险。

JSON查询

如果直接对JSON进行标量查询,可以使用JSON_VALUE函数。该函数使用一种类似JavaScript的符号定位JSON对象中的值。它使用$符 号表示object的根,点号表示属性,方括号表示数组索引。它与PostgreSQL中的json_extract_path_text函数等效。

JSON索引

JSON数据可以直接索引,但开发者可以毫不费力地在标量数据上实现同样的效果。只需要使用JSON_VALUE函数创建一个计算列,然后在这个列上创建索引。

“缺失的”特性

微软针对JSON的支持计划中并没有包含每一个开发者想要的功能。许多人认为,专用的JSONB列类型可以提供更好的性能。其他人希望支持JSON数据修补,而不是必须整个地替换文档。

查看英文原文: SQL Server to add JSON Support

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/22.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
最新文章
HTTP/3 来了,您真的了解它么? 1055
当我谈 HTTP 时,我谈些什么? 8209
新浪短链(t.cn)最新申请官方API的方法讲解。 38728
QUIC / HTTP3 协议详细分析讲解 4176
恭喜那个做云存储的七牛云完成 F 轮 10 亿人民币的融资,开启新的云旅程 5620
Autojs怎么安全加密?Autojs在线加密工具注意事项。 17009
Java JSON 组件选型之 FastJson 为什么总有漏洞? 38283
使用七牛云存储实现图片API,自动删除图片方案合集 5669
神速ICP备案经验分享,ICP备案居然一天就通过了 6887
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 6489
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 556400
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 482669
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 459025
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 420343
Elasticsearch教程(四) elasticsearch head 插件安装和使用 309443
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 286968
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 175435
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 151124
Elasticsearch教程(一),全程直播(小白级别) 150972
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 117402
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...