插入使用 FOR JSON 子句生成的单个 JSON 对象

你可以使用带有 FOR JSON 子句和 WITHOUT_ARRAY_WRAPPER 选项的标准 SELECT 查询生成 JSON 对象,并将其作为第三个参数插入 JSON 文本中:

declare @json nvarchar(4000) = N'{"Id":17,"Name":"WWI"}'
set @json = JSON_MODIFY(@json, '$.table', 
                        JSON_QUERY(
                         (select name, create_date, schema_id
                           from sys.tables
                           where name = 'Colors' 
                           FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
print @json

(1 row(s) affected)
{"Id":17,"Name":"WWI","table":{"name":"Colors","create_date":"2016-06-02T10:04:03.280","schema_id":13}}

如果 SELECT 查询返回多个结果,则带有 WITHOUT_ARRAY_WRAPPER 选项的 FOR JSON 可能会生成无效的 JSON 文本(在这种情况下,你应使用 TOP 1 或按主键过滤)。因此,JSON_MODIFY 将假定返回的结果只是一个纯文本,如果不使用 JSON_QUERY 函数将其包装,则将其转义为任何其他文本。

你应该使用 JSON_QUERY 函数包装 FOR JSON,WITHOUT_ARRAY_WRAPPER 查询,以便将结果转换为 JSON。 ****