SQL Server 2019 脚本中的 json_modify 在对多个元素使用交叉应用时不会更新表

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

我有一个包含以下数据的 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'

说更新了一条记录,但数据实际上并没有更新。

有人建议修改此脚本以更好地更新我的数据吗?

sql json sql-server sql-server-2019
1个回答
0
投票

您可以重建整个

$.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);

db<>小提琴

或者,如果您只有一个值要更新(每整

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;

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.