下面是一个示例查询,它使用带有
FOR JSON
子句的 PATH 模式。 下面的示例使用
ROOT
选项指定一个已命名根元素。
有关 FOR JSON PATH 的详细信息
有关更多详细信息和示例,请参阅
使用 PATH 模式格式化嵌套 JSON 输出 (SQL Server)
。
有关语法和用法,请参阅
for 子句 (Transact-SQL)
。
选项 2 - SELECT 语句使用 FOR JSON AUTO 控制输出
在
AUTO
模式下,SELECT 语句的结构决定 JSON 输出的格式。
默认情况下,输出中不包含
null
值。 可使用
INCLUDE_NULL_VALUES
更改此行为。
下面是一个示例查询,它使用带有
FOR JSON
子句的 AUTO 模式。
SELECT name, surname
FROM emp
FOR JSON AUTO;
下面是返回的 JSON。
"name": "John"
"name": "Jane",
"surname": "Doe"
2.b - JOIN 和 NULL 示例
以下示例 SELECT...FOR JSON AUTO
显示联接表中的数据之间存在 1:多 关系时 JSON 结果的外观。
还说明了返回的 JSON 中缺少 NULL 值。 但是,可以使用 FOR
子句上的 INCLUDE_NULL_VALUES
关键字替代此默认行为。
DROP TABLE IF EXISTS #tabStudent;
DROP TABLE IF EXISTS #tabClass;
CREATE TABLE #tabClass (
ClassGuid UNIQUEIDENTIFIER NOT NULL DEFAULT newid(),
ClassName NVARCHAR(32) NOT NULL
CREATE TABLE #tabStudent (
StudentGuid UNIQUEIDENTIFIER NOT NULL DEFAULT newid(),
StudentName NVARCHAR(32) NOT NULL,
ClassGuid UNIQUEIDENTIFIER NULL -- Foreign key.
INSERT INTO #tabClass (ClassGuid, ClassName)
VALUES
('DE807673-ECFC-4850-930D-A86F921DE438', 'Algebra Math'),
('C55C6819-E744-4797-AC56-FF8A729A7F5C', 'Calculus Math'),
('98509D36-A2C8-4A65-A310-E744F5621C83', 'Art Painting');
INSERT INTO #tabStudent (StudentName, ClassGuid)
VALUES
('Alice Apple', 'DE807673-ECFC-4850-930D-A86F921DE438'),
('Alice Apple', 'C55C6819-E744-4797-AC56-FF8A729A7F5C'),
('Betty Boot', 'C55C6819-E744-4797-AC56-FF8A729A7F5C'),
('Betty Boot', '98509D36-A2C8-4A65-A310-E744F5621C83'),
('Carla Cap', null);
SELECT c.ClassName,
s.StudentName
FROM #tabClass AS c
RIGHT JOIN #tabStudent AS s ON s.ClassGuid = c.ClassGuid
ORDER BY c.ClassName,
s.StudentName
FOR JSON AUTO
-- To include NULL values in the output, uncomment the following line:
--, INCLUDE_NULL_VALUES
DROP TABLE IF EXISTS #tabStudent;
DROP TABLE IF EXISTS #tabClass;
接下来是上述 SELECT 输出的 JSON。
JSON_F52E2B61-18A1-11d1-B105-00805F49916B
{"s":[{"StudentName":"Carla Cap"}]},
{"ClassName":"Algebra Math","s":[{"StudentName":"Alice Apple"}]},
{"ClassName":"Art Painting","s":[{"StudentName":"Betty Boot"}]},
{"ClassName":"Calculus Math","s":[{"StudentName":"Alice Apple"},{"StudentName":"Betty Boot"}]}
有关 FOR JSON AUTO 的详细信息
有关更多详细信息和示例,请参阅使用 AUTO 模式自动格式化 JSON 输出 (SQL Server) 。
有关语法和用法,请参阅 for 子句 (Transact-SQL) 。
控制其他 JSON 输出选项
使用以下附加选项控制 FOR JSON
子句的输出。
ROOT。 若要将单个顶层元素添加到 JSON 输出中,请指定 ROOT 选项。 如果没有指定此选项,JSON 输出不会包括根元素。 有关详细信息,请参阅使用 ROOT 选项将根节点添加到 JSON 输出 (SQL Server) 。
INCLUDE_NULL_VALUES。 若要在 JSON 输出中包含 null 值,请指定 INCLUDE_NULL_VALUES 选项。 如果没有指定此选项,输出不会在查询结果中包括 NULL 值的 JSON 属性。 有关详细信息,请参阅使用 INCLUDE_NULL_VALUES 选项在 JSON 输出中包含 Null 值 (SQL Server) 。
WITHOUT_ARRAY_WRAPPER。 若要删除默认括住 FOR JSON
子句的 JSON 输出的方括号,请指定 WITHOUT_ARRAY_WRAPPER 选项。 使用此选项可以生成单个 JSON 对象作为单行结果中的输出。 如果不指定此选项,JSON 输出将格式化为数组 - 即括在方括号内。 有关详细信息,请参阅使用 WITHOUT_ARRAY_WRAPPER 选项从 JSON 输出中删除方括号 (SQL Server)。
FOR JSON 子句的输出
FOR JSON
子句的输出具有以下特征:
结果集包含单个列。
一个小结果集可包含单个列。
一个大结果集可将长 JSON 字符串拆分到多行中。
默认情况下,输出设置为“以网格显示结果”时,SQL Server Management Studio (SSMS) 会将结果连接到单个行中。 SSMS 状态栏会显示实际行数。
其他客户端应用程序可能需要使用代码,通过串联多个行的内容来将较长的结果重新组合为单个有效的 JSON 字符串。 有关 C# 应用程序中此代码的示例,请参阅在 C# 客户端应用中使用 FOR JSON 输出。
JSON 数组中的元素数量等于 SELECT 语句结果中的行数(应用 FOR JSON 子句前)。
SELECT 语句结果中的每一行(应用 FOR JSON 子句前)将成为数组中的单独 JSON 对象。
SELECT 语句结果中的每一列(应用 FOR JSON 子句前)将成为 JSON 对象的属性。
列的名称及其值都会根据 JSON 语法进行转义。 有关详细信息,请参阅 FOR JSON 如何转义特殊字符和控制字符 (SQL Server) 。
下面是演示 FOR JSON
子句如何格式化 JSON 输出的示例。
FOR JSON 如何将 SQL Server 数据类型转换为 JSON 数据类型 (SQL Server)
FOR JSON 如何转义特殊字符和控制字符 (SQL Server)
JSON 充当 NoSQL 和关系环境之间的桥梁
FOR 子句 (Transact-SQL)
在 SQL Server 和客户端应用中使用 FOR JSON 输出 (SQL Server)