SQL Server 2016有望提供JSON操作原生支持。这一支持的首次迭代将作为SQL Server 2016 CTP 2的一部分发布。CTP又名社区技术预览版,等同于微软的公开Alpha测试,期间,开发者可以提出技术上的修改建议。
“格式化和导出”JSON是CTP 2的主要功能。这可以通过在SELECT语句的末尾增加FOR JSON子句实现。该功能基于FOR XML子句,并且与它类似,允许对结果JSON字符串进行自动和半手工格式化。
微软希望这一语法可以提供与PostgreSQL的row_to_json和json_object函数相同的功能。
大部分功能将在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数据存储在NVARCHAR变量中。在表的列中存储JSON数据也是这样。关于为什么这么做,微软有如下理由:
在包含JSON的NVARCHAR列上使用新的ISJSON函数作为检查约束是个不错的主意。如果不这样做,那么有缺陷的客户端应用程序就可能插入不可解析的字符串,使开发者面临数据污染的风险。
如果直接对JSON进行标量查询,可以使用JSON_VALUE函数。该函数使用一种类似JavaScript的符号定位JSON对象中的值。它使用$符号表示object的根,点号表示属性,方括号表示数组索引。它与PostgreSQL中的json_extract_path_text函数等效。
JSON数据可以直接索引,但开发者可以毫不费力地在标量数据上实现同样的效果。只需要使用JSON_VALUE函数创建一个计算列,然后在这个列上创建索引。
微软针对JSON的支持计划中并没有包含每一个开发者想要的功能。许多人认为,专用的JSONB列类型可以提供更好的性能。其他人希望支持JSON数据修补,而不是必须整个地替换文档。
查看英文原文: SQL Server to add JSON Support