SQL Server 对JSON的支持

soゝso 2016-08-22 18:36:59 1749

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

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

本文主题:

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

相关文章
SQL ServerJSON支持
cpu资源采集.json
JSOUP 教程,JSOUP请求JSON ,JSOUP返回JSON 数据
Java 解析JSONJSON-LIB jar包下载和使用。
JSON格式讲解,JSON获取对象,JSONObject和JSONArray的操作
city.json
json 解析与生成工具类 ,JSON操作讲解(附件)
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ...
JSON压缩算法 JSON.hpack ,JSON压缩实现
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报
最新文章
Macbook teamviewer 突破5分钟,苹果电脑重置 Mac 地址,100%解决限制 220
腾讯云代金券 10000 元/ 30000 代金券领取技巧 324
SEO 换友情链接的主意事项,友情链接断链、友情链接套路说明 229
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 1903
Mac mtr 安装并使用,mrt: command not found 299
Java 集成阿里云消息队列,日志消息存储 497
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 472
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 837
SpringBoot 集成Spring-data-redis,redis对象序列化存储 2029
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 604
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 126781
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 108004
Elasticsearch教程(六) elasticsearch Client创建 78810
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 74434
Elasticsearch教程(二),IK分词器安装 73217
Elasticsearch教程(一),全程直播(小白级别) 65782
Elasticsearch教程(五) elasticsearch Mapping的创建 61877
Elasticsearch教程(三),IK分词器安装 (极速版) 56361
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 53539
Java 解析JSON,JSON-LIB jar包下载和使用。 48973

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

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

正在加载... ...