【问题标题】:How to update insert JSON property in an array of object with T-SQL如何使用 T-SQL 在对象数组中更新插入 JSON 属性
【发布时间】:2019-12-11 18:38:29
【问题描述】:

我正在尝试找到一种有效的方法来将属性插入现有的 json 数组,而不必通过索引来完成。例如说我们有:

DECLARE @json NVARCHAR(MAX);
SET @json = N'
  {
    "objs":[
       {"id":1},
       {"id":2}
     ]
  }
'

如何为数组中的每个对象添加属性?我想做的是这样的:

JSON_MODIFY(@json,'$.objs[].parent_id',1);

但这不起作用,因为我没有提供数组索引。我确信有一个简单的解决方案,但我在文档中找不到。

【问题讨论】:

    标签: sql arrays json sql-server


    【解决方案1】:

    如果您使用 SQL Server 2017+,则可以使用 JSON_MODIFY() 和表达式作为路径,如文档中所述:

    在 SQL Server 2017 (14.x) 和 Azure SQL 数据库中,您可以提供 变量作为路径的值。

    JSON:

    DECLARE @json NVARCHAR(MAX);
    SET @json = N'{
       "objs":[
          {
             "id":1
          },
          {
             "id":2
          }
       ]
    }';
    

    声明:

    SELECT @json = JSON_MODIFY(@json, CONCAT('$.objs[', [key], '].parent_id'), 1)
    FROM OPENJSON(@json, '$.objs')
    

    结果:

    {
       "objs":[
          {
             "id":1,
             "parent_id":1
          },
          {
             "id":2,
             "parent_id":1
          }
       ]
    }
    

    【讨论】:

    • 这正是我想要的谢谢!
    【解决方案2】:

    我想你可以使用OPENJSON 和FOR JSON 来分解和合并 JSON:

    DECLARE @json NVARCHAR(MAX);
    
    SET @json = N'{
      "objs": [{
        "id": 1
      }, {
        "id": 2
      }]
    }';
    
    SELECT id, 1 AS parent_id
    FROM OPENJSON(@json, '$.objs')
    WITH (
        id INT '$.id'
    )
    FOR JSON PATH, ROOT('objs')
    

    结果:

    {
      "objs": [{
        "id": 1,
        "parent_id": 1
      }, {
        "id": 2,
        "parent_id": 1
      }]
    }
    

    【讨论】:

    • 是的,这就是我要尝试的。我只是希望有更好的方法。谢谢!
    • JSON_MODIFY 不会有帮助,因为它一次修改一个属性。除非您事先不知道子对象中键的名称,否则此解决方案应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2020-03-29
    相关资源
    最近更新 更多