首页 > 解决方案 > SQL修改替换json字符串值

问题描述

是否可以通过以下方式更改 sub-json-data 的值?

DECLARE @json NVARCHAR(MAX) = "{"message":"Machine is down","machineId":"165ACE37-4E2C-4D44-9D14-F9E2CB2C2C13","machineName":"1501","ipAddress":"192.168.150.101","time":"2018-05-20T18:33:23.171"}"

SELECT * FROM OPENJSON(@json) 
WITH (  message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    LocalTime datetime2(7) '$.time'
) AS ChangeTime

我想更改我创建的 LocalTime 变量,然后替换当前变量。

我想从 $.time 参数中删除两个小时。

像这样的东西:

UPDATE Table SET ChangeTime.LocalTime = DATEADD(hour,-2,ChangeTime.LocalTime)

输入:" time":"2018-05-20T18:33:23.171"

输出: "time":"2018-05-20T16:33:23.171"

我将如何做到这一点?

标签: jsonsql-servertsql

解决方案


你可以使用JSON_MODIFY

更新 JSON 字符串中的属性值并返回更新后的 JSON 字符串。

SET @json=JSON_MODIFY(@json,'$.time',
   FORMAT(DATEADD(hour,-2,JSON_VALUE(@json,'$.time')),'yyyy-MM-ddTHH:mm:ss.fff'));

SELECT * FROM OPENJSON(@json) 
WITH (  message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    LocalTime datetime2(7) '$.time'
) AS ChangeTime;

DBFIdle 演示


推荐阅读