我有这个 JSON 字符串:
[
{
"Name": "TGName",
"Value": ""
},
{
"Name": "ISD",
"Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
}
]
在此 JSON 中,“Category”键的值需要从“Epr Oxygen”更新为“Damper”。
我编写了这个查询来从上面的 JSON 中获取值 = Epr Oxygen,我得到了该值:
CREATE TABLE SomeTempAVI (input nvarchar(max))
DECLARE @inputWiCate nvarchar(max)='[
{
"Name": "TGName",
"Value": ""
},
{
"Name": "ISD",
"Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
}
]'
INSERT INTO SomeTempAVI
SELECT VALUE
FROM OPENJSON (@inputWiCate)
WITH (Name nvarchar(100), Value nvarchar(max))
WHERE name = 'ISD'
DECLARE @inputValue nvarchar(max)
SELECT @inputValue = Category
FROM OPENJSON ((SELECT TOP 1 input FROM SomeTempAVI))
WITH (SIData NVARCHAR(MAX) AS JSON) a
CROSS APPLY OPENJSON(a.SIData)
WITH (row NVARCHAR(MAX) AS JSON) b
CROSS APPLY OPENJSON(b.row)
WITH (Category NVARCHAR(MAX) '$.Category') c
PRINT @inputValue
DROP TABLE SomeTempAVI
但我不知道如何将该值更新为“阻尼器”。
有人可以帮我吗?
以下代码应该适合您。您需要使用
FOR JSON
再次重建 JSON 数组,使用原始 Value
属性或修改后的 Value
,具体取决于您的条件。
不幸的是,内部对象是双重编码的,这使事情变得复杂。由于某种原因,SQL Server 没有正确地重新编码。您可能想首先调查一下为什么它是双重编码的。请注意,临时表是不必要的
DECLARE @inputWiCate nvarchar(max)='[
{
"Name": "TGName",
"Value": ""
},
{
"Name": "ISD",
"Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
}
]'
SELECT
j1.Name,
Value = CASE WHEN j1.Name = 'ISD'
THEN JSON_MODIFY(j1.value, '$.SIData.row.Category', 'Damper')
ELSE j1.Value
END
FROM OPENJSON (@inputWiCate)
WITH (
Name nvarchar(100),
Value nvarchar(max)
) j1
FOR JSON PATH;
如果Value
不是双重编码,则像这样更改上面的代码
FROM OPENJSON (@inputWiCate)
WITH (
Name nvarchar(100),
Value nvarchar(max) AS JSON
) j1