我在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。
答案 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"}]