我有一个带有json列的表,而json包含一个项目数组。我想更新一些满足给定标准的项目。因此,数组的路径为$.activities
,其中type
为'multichoice i want to set 'data.insightsTitle
到data.title
。
似乎无论如何都没有查询路径(就像好的'xpath),所以我一直在摸不着头脑。
答案 0 :(得分:1)
我想出了这个解决方案,似乎工作并且不太严重!它需要一个循环,因为它正在为匹配的每个数组项写入json列。
begin tran t1
DECLARE @Count int = -1
while @Count != 0
begin
update dp
set definition = JSON_MODIFY(dp.definition, '$.activities[' + (CAST(src.[key] as nvarchar(6)) COLLATE SQL_Latin1_General_CP1_CI_AS) + ']', JSON_MODIFY(src.value, '$.data.insightsTitle', JSON_VALUE(src.value, '$.data.title')))
from
deviceprofile dp
join (
select dp.deviceprofileid, g.*--dp.definition
from deviceprofile dp
CROSS APPLY OPENJSON(dp.definition, '$.activities') g
) src on dp.deviceprofileid = src.deviceprofileid
where JSON_VALUE(src.value, '$.type') = 'multichoice' and JSON_VALUE(src.value, '$.data.insightsTitle') is null
select @count = count(distinct dp.deviceprofileid)
from deviceprofile dp
CROSS APPLY OPENJSON(dp.definition, '$.activities') WITH (type nvarchar(100), insightsTitle nvarchar(256) '$.data.insightsTitle') g
where g.type = 'multichoice' and g.insightsTitle is null
print @count
end
rollback tran
因此,如果你没有指定WITH
,你会得到这个神奇的Key
列,它为你提供索引和数组项的完整json。然后,您只更新该块并使用它们键来为每个匹配的数组项逐个更新整个json字符串。享受。