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)