写点什么

SQL Server 增加 JSON 支持

  • 2015-06-01
  • 本文字数:2054 字

    阅读完需:约 7 分钟

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

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 子句可以减少稍后需要的类型转换数量。

下面是 Jovan Popovic 博文中关于 JSON 支持的例子。

复制代码
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 数据也是这样。关于为什么这么做,微软有如下理由:

  • 迁移——我们发现,人们早已将 JSON 存储为文本,因此,如果我们引入一种单独的 JSON 类型,那么为了使用我们的新特性,他们将需要修改数据库模式,并重新加载数据。而采用现在这种实现方式,开发者不需要对数据库做任何修改就可以使用 JSON 功能。
  • 跨功能的兼容性——所有 SQL Server 组件均支持 NVARCHAR,因此,JSON 也将在所有的组件中得到支持。开发者可以将 JSON 存储在 Hekaton、时态表或列存储表中,运用包括行级安全在内的标准安全策略,使用标准 B 树索引和 FTS 索引,使用 JSON 作为参数或返回过程值,等等。开发者不需要考虑功能 X 是否支持 JSON——如果功能 X 支持 NVARCHAR,那么它也支持 JSON。此外,该特性有一些约束——Hekaton 及列存储不支持 LOB 值,所以开发者只能存储小 JSON 文档。不过,一旦我们在 Hekaton 及列存储中增加了 LOB 支持,那么开发者就可以在任何地方存储大 JSON 文档了。
  • 客户端支持——目前,我们没有为客户端应用程序提供标准 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

2015-06-01 00:547260
用户头像

发布了 1008 篇内容, 共 392.9 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

ETL数据转换方式有哪些?

RestCloud

数据同步 ETL

SRM供应商招采系统(源码)

金陵老街

如何有效改进erp管理系统?erp管理系统改进建议方向

优秀

ERP管理系统

回归营销初心,2023金投赏鲸鸿动能专场聚焦品牌重塑

最新动态

什么是多云? 为什么我们需要多云可观测性 (Observability)?

NineData

多云服务 多云架构 多云管理 多云 多云多源

算启新程 智享未来,英特尔携中国移动为行业数字化转型提供新动能

E科讯

简单聊聊低代码

互联网工科生

低代码 数字化

2023年10款好用的AI生成PPT软件盘点,干货建议收藏!

彭宏豪95

效率 软件 职场 PPT AIGC

Native SQLite Manager for mac(SQLite数据库管理器) 1.26.1全新激活版

mac

苹果mac Windows软件 Native SQLite Manager SQLite 数据库的工具

语音识别技术:现状、挑战与未来发展

来自四九城儿

基于Vue构建的快速开发框架

树上有只程序猿

Vue 低代码

​左手 Serverless,右手 AI,7 年躬身的古籍修复之路

阿里巴巴云原生

阿里云 Serverless 云原生

云桌面如何部署?云桌面系统方案部署详细教程

青椒云云电脑

云桌面 云桌面系统

数字货币双仓合约交易所系统开发搭建

V\TG【ch3nguang】

LeetCode题解:1486. 数组异或操作,模拟,JavaScript,详细注释

Lee Chen

前端代码重复度检测

南城FE

JavaScript 前端 代码

深入浅出了解华为云API网关的Gzip功能

华为云PaaS服务小智

云计算 软件开发 API 华为云

邀你见证一本思维小册子的诞生:《豆哥宝典:思维模型》

豆哥

AI 思维模型 GPT 宝典

持续测试新范式:拨压测一体化

阿里巴巴云原生

阿里云 云原生 压测 拨测

Python 实训教学,更便捷的学生邀请及内容分发|ModelWhale 版本更新

ModelWhale

人工智能 数据分析 在线编程 高等教育 云课堂

Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz

大模型 Zilliz LLM zillizcloud

语音识别技术的优化与发展趋势

来自四九城儿

SQL和Python,哪个更容易自学?哪个更适合数据工作的编程新手?

高端章鱼哥

Python sql

“鲸鸿动能·品牌共创计划”发布,多项权益助力品牌激发无限潜能

最新动态

披荆斩棘的芒果 TV:基于 StarRocks 的云原生湖仓架构升级

StarRocks

体育赛事直播平台源码解决方案,开发搭建系统架构的重要组成部分

软件开发-梦幻运营部

SQL Server增加JSON支持_语言 & 开发_Jonathan Allen_InfoQ精选文章