一种可能的解决方案是解析 JSON 并使用字符串操作对具有所需长度的键再次生成它:
桌子:
CREATE TABLE Data (SerializedData nvarchar(max))
INSERT INTO Data (SerializedData)
VALUES (N'{"Values": { "2019":120, "20191":120, "201902":121, "201903":134, "201904":513 }}')
声明(适用于 SQL Server 2017+):
UPDATE Data
SET SerializedData = JSON_MODIFY(
SerializedData,
'$.Values',
JSON_QUERY(
(
SELECT CONCAT('{', STRING_AGG(CONCAT('"', [key] ,'":', [value]), ','), '}')
FROM OPENJSON(SerializedData, '$.Values') j
WHERE LEN([key]) >= 6
)
)
)
SELECT JSON_QUERY(d.SerializedData, '$.Values') AS [Values]
FROM Data d
结果:
Values
{"201902":121,"201903":134,"201904":513}
笔记:
重要的是要注意,如果新值是并且指向 JSON 对象JSON_MODIFY()
,lax
模式会删除指定的值。但是,在这种特定情况下(具有可变键名的 JSON 对象),我更喜欢上述解决方案。key
NULL
path