如何在SQL中更新Json字符串

问题描述 投票:0回答:1

我有这个 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

但我不知道如何将该值更新为“阻尼器”。

有人可以帮我吗?

sql json
1个回答
0
投票

以下代码应该适合您。您需要使用

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;

db<>小提琴

如果

Value

不是双重编码,则像这样更改上面的代码

FROM OPENJSON (@inputWiCate) WITH ( Name nvarchar(100), Value nvarchar(max) AS JSON ) j1
    
© www.soinside.com 2019 - 2024. All rights reserved.