【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 ...
随机推荐
- 【APP问题定位(一)】夜神模拟器安装及问题
本文较少下夜神模拟器的使用,包括了夜神安装,APK安装,开发者选项打开. 安装夜神模拟器 到 夜神模拟器 网站自行下载安装文件,双击exe文件安装,选择"自定义安装" ...
- [转载] ZooKeeper实现分布式队列Queue
转载自http://blog.fens.me/zookeeper-queue/ 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户 ...
- JAVA面试之集合框架(三)
21.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态 ...
- MSSQL-并发控制-2-Isolation
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! MySQL通过MVCC和锁来实现并发控制,在4 ...
- 关于laravel 用paginate()取值取不到的问题
前几天在写api的时候,出现了一个比较奇怪的问题,用paginate()方法取值取不到的问题,我奇怪的是,我用paginate()方法取值是直接复制粘贴之前自己写过的api中的代码的,怎么突然取不到了 ...
- c语言的typedef
一.typedef作用简介 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 * ...
- RibbonForm使用技巧
Ribbon右侧显示Logo 方法 重写RibbonControl的Paint事件 效果 代码 private void _ribbonControl_Paint(object sender, Pai ...
- TCP/IP协议栈 -----链路层
这节说一下链路层和ARP RARP协议 链路层: 在协议栈中链路层的目的有三个:1. 为IP模块发送或接受数据包 2.为ARP模块发送或接受ARP请求 3. 为RARP模块发送或接受RARP请求. 让 ...
- vue搭建环境
大早起的,没想自己起来那么早,既然起来了,就写点东西吧~最近在看Vue的东西,发现网上也是好多的资源,包括博客和视频 , 我是看的慕课网上的vue ,名字忘记了,价格148的,看了,也整理了笔记,看了 ...
- HDU1171--01背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...