DECLARE @jsontable TABLE (JsonData nvarchar(max) NULL)
DECLARE @JsonData NVARCHAR(MAX) = N'
{
"Sections": {
"SectionType": false,
"SectionName": "Section1"
},
"MultiOptions": [
{
"Customers": {
"CustomerName": "name1",
"Address": "",
"Source1" : "1"
},
"Orders": {
"OrderName": "item1",
"Qty": 1,
"Dest1" : "0",
"PurchasedQty" : "0"
},
"IsMainOption": true
},
{
"Customers": {
"CustomerName": "name2",
"Address": "",
"Source1" : "2"
},
"Orders": {
"OrderName": "item2",
"Qty": 2,
"Dest1" : "0",
"PurchasedQty" : "0"
},
"IsMainOption": false
},
{
"Customers": {
"CustomerName": "name3",
"Address": "",
"Source1" : "3"
},
"Orders": {
"OrderName": "item2",
"Qty": 3,
"Dest1" : "0",
"PurchasedQty" : "0"
},
"IsMainOption": false
}
],
"DateUpdated": "2022-05-24",
"WhoUpdated": 1
}'
INSERT INTO @jsontable
SELECT @JsonData
;WITH cte AS
(
SELECT
MultiOptions.[key] AS MultiOptionsKey,
MultiOptionsCustomers.[key] AS MultiOptionsCustomersKey,
MultiOptionsCustomers.[value] AS MultiOptionsCustomersValue,
MultiOptionsOrders.[key] AS MultiOptionsOrdersKey,
MultiOptionsOrders.[value] AS MultiOptionsOrdersValue,
JsonData
FROM
@jsontable a
CROSS APPLY
OPENJSON(JsonData, '$.MultiOptions') MultiOptions
CROSS APPLY
OPENJSON(MultiOptions.value, '$.Customers') MultiOptionsCustomers
CROSS APPLY
OPENJSON(MultiOptions.value, '$.Orders' ) AS MultiOptionsOrders
)
UPDATE cte
SET JsonData = JSON_MODIFY(JsonData, '$.MultiOptions[' + MultiOptionsKey + '].Customers[' + MultiOptionsCustomersKey + '].Orders[' + MultiOptionsOrdersKey + '].PurchasedQty', 'Qty#Value')
--select * from cte;
I'm getting this error:
The argument 2 of the "JSON_MODIFY" must be a string literal.
when I execute this query.
I need to update below for all items inside array:
UPDATE [MultiOptions.Orders.Dest1] = [MultiOptions.Customers.Source1]
UPDATE [MultiOptions.Customers.PurchasedQty] = [MultiOptions.Customers.Qty]
'$.MultiOptions[' + MultiOptionsKey + '].Customers[' + MultiOptionsCustomersKey + '].Orders[' + MultiOptionsOrdersKey + '].PurchasedQty'supposed to work, when orders is not a child of customers?