📜  在 SQL 中使用 JSON

📅  最后修改于: 2022-05-13 01:55:35.320000             🧑  作者: Mango

在 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

通过 JSON_QUERY 列出的学校列表

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 中,我们已经看到了如何使用它们。