【SqlServer系列】JSON数据
1 概述
本文将结合MSDN简要概述JSON数据。
2 具体内容
JSON 是一种流行的数据格式,用于在现代 Web 和移动应用程序中交换数据。 JSON 还可用于在 Microsoft Azure DocumentDB 等 NoSQL 数据库中存储非结构化数据。 许多 REST Web 服务以 JSON 文本格式返回结果,或接受采用 JSON 格式的数据。 例如,大多数 Azure 服务(如 Azure 搜索、Azure 存储和 Azure DocumentDb)都提供返回或使用 JSON 的 REST 终结点。 JSON 也是用于通过 AJAX 调用在网页与 Web 服务器之间交换数据的主要格式。
2.1 将 JSON 集合转换为行集
DECLARE @json NVARCHAR(MAX)
SET @json =
N'[
{ "id" : 2,"info": { "name": "John", "surname": "Smith" }, "age": 25 },
{ "id" : 5,"info": { "name": "Jane", "surname": "Smith" }, "dob": "2005-11-04T12:00:00" }
]' SELECT *
FROM OPENJSON(@json)
WITH (id int 'strict $.id',
firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',
age int, dateOfBirth datetime2 '$.dob')
2.2 将 SQL Server 数据转换为 JSON 或导出 JSON
通过将 FOR JSON 子句添加到 SELECT 语句中,可将 SQL Server 数据或 SQL 查询结果的格式设置为 JSON。 使用 FOR JSON 委托从客户端应用程序到 SQL Server 的 JSON 输出格式。 有关详细信息,请参阅 借助 FOR JSON 将查询结果的格式设置为 JSON (SQL Server)。
以下示例使用 PATH 模式和 FOR JSON 子句。
SELECT id, firstName AS "info.name", lastName AS "info.surname", age, dateOfBirth as dob
FROM People
FOR JSON PATH
“应用程序池:” FOR JSON 子句将 SQL 结果的格式设置为 JSON 文本,该格式可提供给识别 JSON 的任何应用。 PATH 选项在 SELECT 子句中使用以点分隔的别名,以嵌套查询结果中的对象。
2.3 合并关系数据和 JSON 数据
SQL Server 提供混合模型,用于通过标准 Transact-SQL 语言存储和处理关系数据与 JSON 数据。 可以将 JSON 文档的集合组织到表中,在它们之间建立关系,将表中存储的强类型标量列与 JSON 列中存储的灵活键/值对合并,以及使用完整 Transact SQL 查询一个或多个表中的标量值和 JSON 值。
JSON 文本通常存储在 varchar 或 nvarchar 列中,并编制了纯文本形式的索引。 任何支持文本的 SQL Server 功能或组件均支持 JSON,因此 JSON 和其他 SQL Server 功能之间的交互几乎没有任何约束。你可以将 JSON 存储在内存中或临时表中、对 JSON 文本应用行级别安全性谓词等。
如果在单纯的 JSON 工作负载中,你想要使用专用于处理 JSON 文档的自定义查询语言,可以考虑 Microsoft Azure DocumentDB。
以下用例说明如何在 SQL Server中使用内置的 JSON 支持。
2.4 从格式化为 JSON 的 SQL Server 表返回数据
如果你的 Web 服务从数据库层提取数据并以 JSON 格式返回数据,或者在接受已格式化为 JSON 的数据的 JavaScript 框架或库中返回数据,则可以直接在 SQL 查询中设置 JSON 输出的格式。 你可以使用 FOR JSON 将 JSON 格式设置委托给 SQL Server,而非编写代码或者包含一个库来转换表格查询结果对象,然后将对象序列化为 JSON 格式。
例如,你可能想要生成符合 OData 规范的 JSON 输出。 Web 服务需要采用以下格式的请求和响应。
请求:
/Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName
响应:
{"@odata.context":"http://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity","ProductID":1,"ProductName":"Chai"}
此 OData URL 代表针对 ID 为 1 的产品的 ProductID 和 ProductName 列的请求。 可以使用 FOR JSON 按 SQL Server 中所需的格式设置输出格式。
SELECT 'http://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity'
AS '@odata.context',
ProductID, Name as ProductName
FROM Production.Product
WHERE ProductID = 1
FOR JSON AUTO
此查询的输出是完全符合 OData 规范的 JSON 文本。 格式设置和转义由 SQL Server 处理。 SQL Server 还可将查询结果的格式设置为任何格式,如 OData JSON 或 GeoJSON - 有关详细信息,请参阅 Returning spatial data in GeoJSON format(以 GeoJSON 格式返回空间数据)。
2.5 使用 SQL 查询分析 JSON 数据
如果必须筛选或聚合 JSON 数据以用于报告,可以使用 OPENJSON 将 JSON 转换为关系格式。 然后,使用标准 Transact-SQL 和内置函数来准备报告。
SELECT Tab.Id, SalesOrderJsonData.Customer, SalesOrderJsonData.Date
FROM SalesOrderRecord AS Tab
CROSS APPLY
OPENJSON (Tab.json, N'$.Orders.OrdersArray')
WITH (
Number varchar(200) N'$.Order.Number',
Date datetime N'$.Order.Date',
Customer varchar(200) N'$.AccountNumber',
Quantity int N'$.Item.Quantity'
)
AS SalesOrderJsonData
WHERE JSON_VALUE(Tab.json, '$.Status') = N'Closed'
ORDER BY JSON_VALUE(Tab.json, '$.Group'), Tab.DateModified
可以在同一个查询中使用标准表列和来自 JSON 文本的值。 可以在 JSON_VALUE(Tab.json, '$.Status')
表达式上添加索引以提高查询的性能。 有关详细信息,请参阅 对 JSON 数据编制索引。
2.6 将 JSON 数据导入 SQL Server 表
如果必须将 JSON 数据从外部服务加载到 SQL Server,则可以使用 OPENJSON 将数据导入 SQL Server,而非分析应用程序层中的数据。
DECLARE @jsonVariable NVARCHAR(MAX) SET @jsonVariable = N'[
{
"Order": {
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
},
"AccountNumber":"AW29825",
"Item": {
"Price":2024.9940,
"Quantity":1
}
},
{
"Order": {
"Number":"SO43661",
"Date":"2011-06-01T00:00:00"
},
"AccountNumber":"AW73565",
"Item": {
"Price":2024.9940,
"Quantity":3
}
}
]' INSERT INTO SalesReport
SELECT SalesOrderJsonData.*
FROM OPENJSON (@jsonVariable, N'$.Orders.OrdersArray')
WITH (
Number varchar(200) N'$.Order.Number',
Date datetime N'$.Order.Date',
Customer varchar(200) N'$.AccountNumber',
Quantity int N'$.Item.Quantity'
)
AS SalesOrderJsonData;
外部 REST 服务可以提供 JSON 变量的内容,这些内容将从客户端 JavaScript 框架作为参数发送,或者从外部文件加载。 你可以在 SQL Server 表中轻松插入、更新或合并来自 JSON 文本的结果。 有关此方案的详细信息,请参阅以下博客文章。
- Importing JSON data in SQL Server
- Upsert JSON documents in SQL Server 2016
- Loading GeoJSON data into SQL Server 2016。
2.7 将 JSON 文件加载到 SQL Server
文件中存储的信息可格式化为标准 JSON 或行分隔的 JSON。 SQL Server 可以导入 JSON 文件的内容,使用 OPENJSON 或 JSON_VALUE 函数分析内容,并将其加载到表中。
如果 JSON 文档存储在可由 SQL Server 访问的本地文件、共享网络驱动器或 Azure 文件存储位置,可以使用批量导入将 JSON 数据加载到 SQL Server。 有关此方案的详细信息,请参阅 Importing JSON files into SQL Server using OPENROWSET (BULK)(使用 OPENROWSET (BULK) 将 JSON 文件导入 SQL Server)。
如果行分隔的 JSON 文件存储在 Azure Blob 存储或 Hadoop 文件系统中,你可以使用 Polybase 来加载 JSON 文本,在 Transact-SQL 代码中分析文本,然后将其载入表中。
2.8 测试驱动内置的 JSON 支持
使用 AdventureWorks 示例数据库测试驱动内置 JSON 支持。 若要获取 AdventureWorks 示例数据库,必须从 此处。 将示例数据库还原到 SQL Server 2016 实例后,请解压缩示例文件,然后从 JSON 文件夹中打开“JSON Sample Queries procedures views and indexes.sql”文件。 运行此文件中的脚本,将某些现有数据的格式重新设置为 JSON 数据,对 JSON 数据运行示例查询和报告,为 JSON 数据编制索引,然后导入和导出 JSON。
下面是你可以对该文件中包含的脚本执行的操作。
使现有架构非规范化以创建 JSON 数据的列。
将 SalesReasons、SalesOrderDetails、SalesPerson、Customer 和包含销售订单相关信息的表中的信息存储到 SalesOrder_json 表的 JSON 列中。
将 EmailAddresses/PersonPhone 表中的信息作为 JSON 对象的数组存储到 Person_json 表中。
创建查询 JSON 数据的过程和视图。
为 JSON 数据编制索引 – 为 JSON 属性和全文索引创建索引。
导入和导出 JSON – 创建并运行以 JSON 结果形式导出 Person 和 SalesOrder 表内容,并使用 JSON 输入导入和更新 Person 与 SalesOrder 表的过程。
运行查询示例 – 运行一些查询,用于调用步骤 2 和 4 中创建的存储过程与视图。
清理脚本 – 如果你想要保留步骤 2 和 4 中创建的存储过程与视图,请不要运行此部件。
3 参考文献
【01】https://docs.microsoft.com/zh-cn/sql/relational-databases/json/json-data-sql-server
4 版权
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
- 可以转载该博客,但必须著名博客来源。
【SqlServer系列】JSON数据的更多相关文章
- Android系列---JSON数据解析
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- java系列--JSON数据的处理
http://blog.csdn.net/qh_java/article/details/38610599 http://www.cnblogs.com/lanxuezaipiao/archive/2 ...
- (菜鸟要飞系列)四,基于Asp.Net MVC5的后台管理系统(zTree绑定Json数据生成树)
上一次老师让我们用递归将中国城市镇县四级联动 显示在树上,那个时候就知道可以显示在zTree上,可是苦于对Json的不了解,对zTree的Api的不了解,一直没有做出来,只好将递归算法显示在了窗体上, ...
- 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述
[前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...
- 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...
- [系列] Go 如何解析 JSON 数据?
概述 最近掉进需求坑了,刚爬上来,评估排期出现了严重问题,下面三张图很符合当时的心境. 谈需求 估排期 开始干 为啥会这样,我简单总结了下: 与第三方对接. 跨团队对接. 首次用 Go 做项目. 业务 ...
- $Java-json系列(二):用JSONObject解析和处理json数据
本文中主要介绍JSONObject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s/1c27Uyre ( ...
- 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...
- 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...
随机推荐
- js经典闭包
setTimeout函数之循环和闭包 前言 之前对于setTimeout的一个经典问题的理解总是感到很迷惑,现在好像清晰一点了,所以把我的理解写下来,我对js的理解也不深入,如果有错误,请务必指出.以 ...
- Docker Register安装与基本认证
准备 基本事项 Docker环境 登录授权方式 镜像存放地址 HTTPS外网访问 启动Docker Registry 1. 基本事项 本篇涉及到的数据文件都放在/data目录下, 其中会有三个子目录 ...
- Python中__new__和__init__区别
__new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值 1.在类中,如果__new__和__init__同时存在,会优先调用 ...
- 图文详解AO打印(端桥模式)
一.概述 AO打印是英文Active-Online Print的简称,也称主动在线打印.打印前支持AO通讯协议的AO打印机首先通过普通网络与C-Lodop服务保持在线链接,网页程序利用JavaSc ...
- eclipse搭建maven ssm项目
file --> new --> maven project -->创建个简单的maven项目 会报错,没事 右键 properties 先去掉,然后再勾上 接下来配置maven的相 ...
- Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践
protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...
- input取值区间实例
前端开发中经常会遇到 input 取值区间的需求,比如搜索的时候,价格区间,积分值区间 大致的需求为 input 的值必须是正整数,第二个 input 的值必须大于第一个 DOM结构如下: <d ...
- DP 网易内推:合唱团
链接:https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8来源:牛客网 [编程题]合唱团 热度指数:18 ...
- SSM框架开发web项目系列(一) 环境搭建篇
前言 开发环境:Eclipse Mars + Maven + JDK 1.7 + Tomcat 7 + MySQL 主要框架:Spring + Spring MVC + Mybatis 目的:快速上手 ...
- thinkphp3.2.3的使用心得之i方法(零)
从模板传参到控制器 模板中代码: <volist name="list" id="vo"> <a href="__CONTROLLE ...