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

时间:2017-12-21 02:19:09

标签: sql json sql-server tsql syntax

我在JSON_MODIFY看到的每个示例都显示了将一个简单的值(例如string)插入到数组中。

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

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

如何将{"id": 3, "name": "Three"}附加到其中?

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

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;

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

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
);

我收到以下错误:

  

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

1 个答案:

答案 0 :(得分:10)

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

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

以下是完整的示例:

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

这是最终输出:

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

有关JSON_QUERY here的更多信息,问题的解释为here

相关问题