将对象插入SQL Server中的JSON数组

Way*_*oss 5 sql t-sql sql-server syntax json

我见过的每个例子都JSON_MODIFY显示了将一个简单的值(如a)string插入到数组中.

假设我的SQL Server列中存储了以下JSON:

[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}]

我如何追加{"id": 3, "name": "Three"}它?

当我尝试使用JSON_MODIFY如下所示时,string插入a:

UPDATE TheTable SET TheJSON = JSON_MODIFY(TheJSON, 'append $', N'{"id": 3, "name": "Three"}') WHERE Condition = 1;

以下是TheJSON列的结果值:

[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}, "{\"id\":3, \"name\": \"Three\"}"]

其他尝试:

我注意到我可以像这样创建我想要的JSON字符串:

SELECT json.*
FROM TheTable t
CROSS APPLY OPENJSON(t.TheJSON) WITH (
    id int N'$.id',
    name nvarchar(100) N'$.name'
)
UNION ALL
SELECT 3 as id, N'Three' as name
FOR JSON AUTO;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在更新语句中使用它时,它不起作用:

UPDATE TheTable
SET TheJSON = (
    SELECT json.* FROM TheTable t
    CROSS APPLY OPENJSON(t.TheJSON) WITH (
        id int N'$.id',
        name nvarchar(100) N'$.name'
    ) as json
    UNION ALL -- NO ERROR (and no update) when I remove UNION ALL+SELECT
    SELECT 3 as id, N'Three' as name
    FOR JSON AUTO
);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

消息1086,级别15,状态1,行1:FOR XML和FOR JSON子句在视图,内联函数,派生表和子查询中包含集合运算符时无效.要解决此问题,请使用派生表或公用表表达式或视图包装包含set运算符的SELECT,并在其上应用FOR XML或FOR JSON.

And*_*rea 12

您应该使用以下内容包装JSON_MODIFY语句的第三个参数JSON_QUERY():

UPDATE TheTable 
SET TheJSON = JSON_MODIFY(TheJSON, 'append $', JSON_QUERY(N'{"id": 3, "name": "Three"}')) 
WHERE Condition = 1;
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例:

DECLARE @TheTable table(TheJSON nvarchar(max), Condition int )
DECLARE @mystring nvarchar(100)='{"id": 3, "name": "Three"}'

INSERT INTO @TheTable SELECT '[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}]', 1

UPDATE @TheTable 
SET TheJSON = JSON_MODIFY(TheJSON, 'append $', JSON_QUERY(N'{"id": 3, "name": "Three"}')) 
WHERE Condition = 1;

SELECT TheJSON FROM @TheTable
Run Code Online (Sandbox Code Playgroud)

这是最终输出:

[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"},{"id": 3, "name": "Three"}]
Run Code Online (Sandbox Code Playgroud)

更多信息在JSON_QUERY 这里,问题的解释在这里.