写点什么

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:547831
用户头像

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

关注

评论

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

IT基础实施架构与服务器设备维保实施技术方案(Doc))

金陵老街

IT运维

Bank of America公布2025年第三季度财务业绩

财见

大数据-127 - Flink StateBackend详解:Memory、Fs、RocksDB 与 OperatorState 管理机制与重分配原理

武子康

Java 大数据 flink spark 分布式

同一设备多账号登录,如何避免消息推送“串门”?

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

哈尔滨等保测评:护航信息安全的关键之举

等保测评

国内域名注册商优劣势分析和推荐

防火墙后吃泡面

DXC获评财产险与意外险领导者

财见

什么是绿电直连管理系统?

西格电力

光伏发电 新能源 绿电直连 可再生能源发电 绿色低碳发展

鸿蒙应用开发从入门到实战(二十四):一文搞懂ArkUI网格布局

程序员潘Sir

鸿蒙 HarmonyOS

工业设计 自控设计经验总结(12)

万里无云万里天

设计师 工业 工厂运维

Excelize 开源基础库发布 2.10.0 版本更新

xuri

GitHub 开源 Excel Excelize AI 数据基础设施

黑龙江二级等保测评:构建基础安全框架的核心路径

等保测评

AI 推理服务是否真的无利可图?从第一性原理看 AI 推理成本

Baihai IDP

AI LLM AI 推理服务

怎么避免无意义劳动?奇富科技摈弃分库分表后,代码改造成本节省90%

老纪的技术唠嗑局

数据库 TiDB #OceanBase

西工大开源 Easy Turn:全双工轮次转换检测模型;百度 MuseSteamer 引入开放世界生成能力丨日报

RTE开发者社区

智能制造 柔性制造经验总结(5)

万里无云万里天

工业 智能制造 柔性制造

你的程序为何卡顿?从LINUX I/O三大模式寻找答案

poemyang

RPC Liunx

多模块项目使用ElasticSearch报错

刘大猫

人工智能 云计算 算法 物联网 大模型

爱立信公布2025年第三季度财报

财见

新的ETC简报:能源生产力的提高使GDP翻倍,同时将能源需求减少四分之一

财见

有哪些ChatBI产品使用了NL2DSL2SQL的技术路线,其市场成熟度如何?

飞鲤

商业智能 dsl NL2SQL NL2DSL

解锁机械加工MES新机遇,共创智能制造未来

万界星空科技

低代码开发平台 mes 机械加工行业 机械加工mes MES平台

Transformer的线代基础

陈一之

AI技术 大模型 技术原理

Vercel+Cloudflare搞定出海域名,10分钟完美绑定丨小白AI出海教程

阿星AI工作室

AI 产品经理 Vercel Cloudflare

AI 项目的开发流程

北京木奇移动技术有限公司

AI技术开发 软件外包公司 AI应用开发

AI PC开发套件瑞莎“星睿O6”--ubuntu环境安装

IT蜗壳-Tango

AI 技术在股票领域应用

北京木奇移动技术有限公司

AI技术开发 软件外包公司 AI应用开发

Sight AI 入门:5分钟实现OpenAI兼容的多模型AI调用

SightAI

MaaS 大模型 API 工具 开源‘

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