在 SQL 中使用 JSON
JSON代表Javascript Object Notation 。它主要用于存储和传输数据。大多数 NoSQL 数据库,如 MongoDB、CouchDB 等,都使用 JSON 格式的数据。每当您的数据从一台服务器传输到网页时,JSON 格式是首选格式,因为前端应用程序如 Android、iOS、React 或 Angular 等,可以解析 JSON 内容并根据方便显示它们。即使在 SQL 中,我们也可以发送 JSON 数据并可以轻松地将它们存储在行中。让我们一一看看。
让我们使用 Azure Data Studio for SQL Server。让我们也创建数据库并放置一个表。然后可以继续处理 JSON。 Azure Data Studio 适用于 Windows 10、Mac 和 Linux 环境。它可以从这里安装。
数据库创建:
创建数据库的命令。这里 GEEKSFORGEEKS 是数据库名称。
CREATE DATABASE GEEKSFORGEEKS;
要使数据库处于活动状态,请使用以下命令:
USE GEEKSFORGEEKS;
用数据创建表:
现在让我们创建一个名为“ Authors ”的表,并让我们向其中插入一些数据,如下所示:
CREATE TABLE Authors (
ID INT IDENTITY NOT NULL PRIMARY KEY,
AuthorName NVARCHAR(MAX),
Age INT,
Skillsets NVARCHAR(MAX),
NumberOfPosts INT
);
INSERT INTO Authors (AuthorName,Age,Skillsets,NumberOfPosts) VALUES ('Geek',25,'Java,Python,.Net',5);
GO
INSERT INTO Authors (AuthorName,Age,Skillsets,NumberOfPosts) VALUES ('Geek2',22,'Android,Python,.Net',15);
GO
INSERT INTO Authors (AuthorName,Age,Skillsets,NumberOfPosts) VALUES ('Geek3',23,'IOS,GO,R',10);
GO
INSERT INTO Authors (AuthorName,Age,Skillsets,NumberOfPosts) VALUES ('Geek4',24,'Java,Python,GO',5);
GO
JSON 是连接 NoSQL 和关系世界的绝佳选择。因此,如果您有从 MongoDB 导出的数据并需要将它们导入 SQL Server,我们可以按照以下方法
JSON 文档可以按 LOB 存储格式或关系存储格式按原样存储在 NVARCHAR 列中。必须解析原始 JSON 文档,它们可能包含非英语文本。通过使用 nvarchar(max) 数据类型,我们可以存储最大容量为 2 GB 的 JSON 文档。如果 JSON 数据不是很大,我们可以选择 NVARCHAR(4000),否则出于性能原因我们可以选择 NVARCHAR(max)。
跨功能兼容性:
将 JSON 文档保留为 NVARCHAR 格式的主要原因是为了跨功能兼容性。 NVARCHAR 与 X 特性一起使用,即所有 SQL 服务器组件,例如 Hekaton(OLTP)、临时表或列存储表等。由于 JSON 行为也是这种方式,因此它表示为 NVARCHAR 数据类型。
移民:
在 SQL Server 2016 之前,JSON 以文本形式存储在数据库中。因此,需要更改数据库架构,并且迁移以 NVarchar 格式的 JSON 类型发生
客户端支持:
JSON 在 JavaScript 中仅被视为对象,因此称为 Javascript 对象表示法。客户端没有类似于 XmlDom 对象的特定标准化 JSON 对象类型。
让我们看看 SQL Server 中可用于 JSON 数据的重要功能。
JSON 数据示例:
{
"Information":
{"SchoolDetails":
[{"Name": "VidhyaMandhir"}, {"Name": "Chettinad"}, {"Name":"PSSenior"}]
}
}
1. ISJSON( JSON字符串):
此函数用于检查给定的输入 json字符串是否为 JSON 格式。如果是 JSON 格式,则返回 1 作为输出,否则返回 0。即,它以 INT 格式返回 1 或 0。
SELECT ISJSON(@JSONData) AS VALIDJSON
2. JSON_VALUE( JSON字符串,路径):
输出将是来自给定 JSON 字符串的标量值。 JSON字符串的解析已完成,并且有一些特定格式可用于提供路径。例如
- '$' – 引用整个 JSON 对象
- '$.Example1' – 在 JSON 对象中引用 Example1
- '$[4]' – 引用 JSON 数组中的第四个元素
- '$.Example1.Example2[2].Example3' – 引用 JSON 对象中的嵌套属性
例子 :
SELECT JSON_VALUE(@JSONData,'$.Information.SchoolDetails[0].Name') as SchoolName
3. JSON_QUERY( JSON字符串,路径)
用于从 JSON字符串提取数据或对象数组。
SELECT JSON_QUERY(@JSONData,'$.Information.SchoolDetails')
AS LISTOFSCHOOLS
4. JSON_MODIFY:
(Transact-SQL)函数有一个名为“JSON_MODIFY”的选项可用于更新 JSON字符串中的属性值并返回更新后的 JSON字符串。每当需要更改 JSON 文本时,我们都可以这样做
SET @JSONData= JSON_MODIFY(@JSONData, '$.Information.SchoolDetails[2].Name', 'Adhyapana');
SELECT modifiedJson = @JSONData;
5. 对于 JSON :
此函数用于将 SQL Server 数据导出为 JSON 格式。这是将 SQL 数据导出为 JSON 格式的有用函数。 FOR JSON 有两个可用选项
- AUTO:因为它是嵌套的 JSON 子数组,所以基于表层次结构创建。
- PATH:通过使用它,我们可以自定义方式定义 JSON 的结构。
SELECT * FROM Authors FOR JSON AUTO;
SELECT * FROM Authors FOR JSON AUTO, ROOT ('AuthorInfo')
6. 开放JSON:
此函数用于将 JSON 作为字符串数据导入。我们可以使用 OPENROWSET函数将 JSON 作为文本文件导入,并且应该启用 BULK 选项。它返回一个单独的字符串字段,其中 BulkColumn 作为其列名。
例子 :
DECLARE @JSON VARCHAR(MAX)
--Syntax to get json data using OPENROWSET
SELECT @JSON = BulkColumn FROM OPENROWSET
(BULK '', SINGLE_CLOB) AS j
--To check json valid or not, we are using this ISJSON
SELECT ISJSON(@JSON)
--If ISJSON is true, then display the json data
If (ISJSON(@JSON)=1)
SELECT @JSON AS 'JSON Text'
注意:即使是大数据也可以放置。作为示例,我们只显示了一行。
SINGLE_BLOB,它将文件读取为 varbinary(max)。 SINGLE_NCLOB,将文件读取为 nvarchar(max) — 如果内容是日文或中文等非英文文本,则需要采用这种模式。我们使用了 SINGLE_CLOB,它将文件读取为 varchar(max)。
它将生成一个关系表,其中包含来自 JSON字符串的内容。创建的每一行都可以通过遍历 JSON 对象元素来获取,OPENJSON 可用于将 JSON 解析为文本。让我们将一个 JSON 放在一个外部文件中,它的内容是
Select * FROM OPENJSON (@JSON)
SELECT @JSON = BulkColumn
FROM OPENROWSET
(BULK '', SINGLE_CLOB)
AS j
--If the retrieved JSON is a valid one
If (ISJSON(@JSON)=1)
Select * FROM OPENJSON (@JSON)
我们可以看到,像“ authorname ”和“skills”这样的“Strings”键的类型为1,而“id”和“age”这样的“int”键的类型为2。同样,对于boolean,类型为3。对于数组为 4,对象为 5。OPENJSON 仅解析 JSON 的根级别。
如果 JSON 是嵌套的,我们需要使用 Path 变量
Select * FROM OPENJSON (@JSON, '$.skills')
我们甚至可以将技能集作为数据列作为
SELECT * FROM OPENJSON (@JSON, '$.skills')
WITH ( skill1 VARCHAR(25), skill2 VARCHAR(25), skill3 VARCHAR(25) )
将行集保存到表中:这里的列数应与内部存在的计数相匹配:
SELECT ,,.... INTO FROM OPENJSON (@JSON, '$.skills')
WITH (skill1 VARCHAR(25),
skill2 VARCHAR(25),
skill3 VARCHAR(25)
)
更改 JSON 值:
(Transact-SQL)函数有一个名为“JSON_MODIFY”的选项可用于更新 JSON字符串中的属性值并返回更新后的 JSON字符串。每当需要更改 JSON 文本时,我们都可以这样做
DECLARE @json NVARCHAR(MAX);
SET @json = '{"Information": {"SchoolDetails": [{"Name": "VidhyaMandhir"}, {"Name": "Chettinad"}, {"Name":"PSSenior"}]}}';
SET @json = JSON_MODIFY(@json, '$.Information.SchoolDetails[2].Name', 'Adhyapana');
SELECT modifiedJson = @json;
结论 :
JSON 数据现在非常必要,它对于跨多个服务器存储和传输数据非常需要,所有软件都将其用于许多有用的目的。所有 REST API 调用都提供 JSON 作为输出媒介,在 SQL Server 中,我们已经看到了如何使用它们。