You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅单个URL被追加?Setting表JSON字段批量添加URL异常

问题:SQL批量追加JSON数组元素仅成功添加第一个的原因?

尝试向Setting表的现有记录中添加5个新URL,执行的SQL代码如下:

DECLARE @Setting TABLE(Id INT, JsonInfo VARCHAR(Max))

INSERT INTO @Setting  -- (2 rows affected)
VALUES
(1, '{"urls":["/test1"]}'),
(2, '{"urls":["/test2"]}');

--select * from @Setting;  -- (2 rows affected)

DECLARE @newUrls TABLE(Url VARCHAR(100))

INSERT INTO @newUrls  --(5 rows affected)
VALUES
('/test3'),
('/test4'),
('/test5'),
('/test6'),
('/test7');

SELECT u.*, s.*    -- (10 rows affected)
FROM @Setting s, @newUrls u;


UPDATE @Setting -- (2 rows affected).
SET JsonInfo = REPLACE(JSON_MODIFY(s.JsonInfo, 'append $.urls', Url), '\/', '/')
FROM  @newUrls, @Setting s;


SELECT JSON_QUERY(JsonInfo, '$.urls') from @Setting;  --(2 rows affected). only '/test3' got appended

执行后发现仅/test3被成功追加,而预期是5个新URL全部添加,请问问题出在哪里?


问题原因与解决方案

问题根源

你的UPDATE语句用逗号连接@newUrls和@Setting,属于交叉连接写法,会生成10条匹配记录(2条Setting × 5条newUrls)。但SQL Server处理UPDATE时,对每个Setting记录只会执行一次更新操作,默认取交叉连接结果集中的第一行数据(也就是/test3),剩下的4条匹配行不会生效,所以最终每个Setting记录只追加了第一个新URL。

解决方案

要一次性把所有新URL追加到原有数组里,需先将@newUrls中的所有URL合并成一个JSON数组,再通过JSON_MODIFY一次性追加到每个Setting记录的urls数组中,具体代码如下:

DECLARE @Setting TABLE(Id INT, JsonInfo VARCHAR(Max))

INSERT INTO @Setting
VALUES
(1, '{"urls":["/test1"]}'),
(2, '{"urls":["/test2"]}');

DECLARE @newUrls TABLE(Url VARCHAR(100))

INSERT INTO @newUrls
VALUES
('/test3'),
('/test4'),
('/test5'),
('/test6'),
('/test7');

-- 将所有新URL合并为一个JSON数组字符串
DECLARE @newJsonArray NVARCHAR(MAX) = (
    SELECT QUOTENAME(Url, '"') AS [value]
    FROM @newUrls
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
);

-- 一次性追加整个数组到原有urls中
UPDATE @Setting
SET JsonInfo = REPLACE(
    JSON_MODIFY(JsonInfo, 'append $.urls', JSON_QUERY('[' + @newJsonArray + ']')),
    '\/', '/'
);

-- 验证结果
SELECT JSON_QUERY(JsonInfo, '$.urls') FROM @Setting;

代码说明

  1. 生成JSON数组:通过FOR JSON PATH把@newUrls中的所有URL转换成JSON数组格式的字符串,WITHOUT_ARRAY_WRAPPER避免自动添加外层数组,方便后续拼接。
  2. 批量追加数组:使用JSON_MODIFY的append操作,结合JSON_QUERY把整个新数组追加到原有urls数组中,确保每个Setting记录一次性获得所有5个新URL。
  3. 转义处理:REPLACE函数用来去除JSON_MODIFY自动添加的转义斜杠,还原正确的URL格式。

内容的提问来源于stack exchange,提问作者Daniel B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:27:37