Если я следую тому, что вы пытаетесь сделать, это должно сработать. Я не знаю, сколько записей в вашей таблице, поэтому может потребоваться некоторая настройка / настройка.
DECLARE @MyTable TABLE
(
ID INT IDENTITY (1,1) NOT NULL
,JsonCol NVARCHAR(MAX)
)
INSERT INTO @MyTable
(
JsonCol
)
VALUES
(N'{
"MainItem":{
"UserId":4,
"UserName":"name",
"CityDetails":{
"CityId":1,
"CityName":"egypt"
},
"ListSubItems":[
{
"UserId":2,
"UserName":"name2",
"FullDescription":"",
"ShortDescription":"wish",
"CityDetails":{
"CityId":2,
"CityName":"us"
}
},
{
"UserId":3,
"UserName":"name3",
"FullDescription":"",
"ShortDescription":"wish",
"CityDetails":{
"CityId":44,
"CityName":"sau"
}
}
]
}
}'
)
UPDATE @MyTable
Set JsonCol =
JSON_MODIFY
(jsonCol
,'$.MainItem.ListSubItems'
,(select
orig.UserId
,COALESCE(NewVals.UserName, orig.UserName) as UserName
,orig.FullDescription
,orig.ShortDescription
,orig.CityDetails
from OPENJSON(jsonCol, '$.MainItem.ListSubItems')
WITH (
UserId INT
,UserName NVARCHAR(100)
,FullDescription NVARCHAR(1000)
,ShortDescription NVARCHAR(250)
,CityDetails NVARCHAR(MAX) as json
) as orig
left join
(
SELECT 3 as UserID, 'new name' as UserName
) as NewVals ON orig.UserId = NewVals.UserID
FOR JSON AUTO)
)
SELECT * FROM @MyTable