我有一个包含以下数据的 SQL Server 2019 表:
CREATE TABLE mytable2
(
jsondata nvarchar(max)
)
INSERT INTO mytable2
VALUES ('
{
"name": "Daily06012023",
"documents": [
{
"imageUrl": "s3://2023/129/2312908000.tif",
"json": {
"indexingRecordId": "2312908000",
"instrumentNumber": "2312908000"
}
},
{
"imageUrl": "s3://2023/129/2312908000.tif",
"json": {
"indexingRecordId": "2312908001",
"instrumentNumber": "2312908001"
}
},
{
"imageUrl": "s3://2023/129/2312908000.tif",
"json": {
"indexingRecordId": "2312908002",
"instrumentNumber": "2312908002"
}
},
{
"imageUrl": "s3://2023/129/2312908000.tif",
"json": {
"indexingRecordId": "2312908003",
"instrumentNumber": "2312908003"
}
}
]
}
'
)
我正在尝试使用
json_modify
来更新特定 imageUrl
的 indexingRecordId
。但是,我的脚本实际上都没有更新 json 中的数据。我看到的一些示例希望我使用 [0] 文档位置,但我经常在具有数百或数千条记录的 json 中运行这些更新,因此我并不总是知道文档位置。
有人建议修改此脚本以正确应用我的更新吗?
我已经尝试过这个脚本:
UPDATE mytable2
SET jsondata = JSON_MODIFY(jsondata, '$.documents.imageUrl', 's3://NEW_Path/2312908003.tif')
FROM mytable2
CROSS APPLY OPENJSON(jsondata, '$.documents') AS documents
WHERE JSON_VALUE(documents.value, '$.json.indexingRecordId') = '2312908003'
说更新了一条记录,但数据实际上并没有更新。
有人建议修改此脚本以更好地更新我的数据吗?
您可以重建整个
$.documents
财产
UPDATE mytable2
SET jsondata = JSON_MODIFY(jsondata, '$.documents', j.documents)
OUTPUT inserted.*
FROM mytable2
CROSS APPLY (
SELECT
IIF(
indexingRecordId = '2312908003',
's3://NEW_Path/2312908003.tif',
imageUrl
) AS imageUrl,
indexingRecordId AS [json.indexingRecordId],
instrumentNumber AS [json.instrumentNumber]
FROM OPENJSON(jsondata, '$.documents')
WITH (
imageUrl nvarchar(1000),
indexingRecordId nvarchar(1000) '$.json.indexingRecordId',
instrumentNumber nvarchar(1000) '$.json.instrumentNumber'
) AS documents
FOR JSON PATH
) j(documents);
或者,如果您只有一个值要更新(每整
mytable2
行),您可以获取其路径并进行该更新:
UPDATE mytable2
SET jsondata = JSON_MODIFY(jsondata, N'$.documents[' + j.idx + N'].imageUrl', 's3://NEW_Path/2312908003.tif')
OUTPUT inserted.*
FROM mytable2
CROSS APPLY (
SELECT TOP (1) j1.[key] AS idx
FROM OPENJSON(jsondata, '$.documents') j1
CROSS APPLY OPENJSON(j1.value)
WITH (
indexingRecordId nvarchar(1000) '$.json.indexingRecordId'
) AS documents
WHERE indexingRecordId = '2312908003'
) j
WHERE j.idx IS NOT NULL;