Sql 使用JSON_MODIFY更新JSON

Sql 使用JSON_MODIFY更新JSON,sql,json,sql-server,sql-server-json,Sql,Json,Sql Server,Sql Server Json,我将JSON数据存储在SQL Server中 我的桌子看起来像: 表名:JsonData 列:ID、数据 我的JSON看起来像: { "data": [{ "identifier": 1, "someData": { "sample1": "lorem 1", "sample2": "test 1" } }, {

我将JSON数据存储在SQL Server中

我的桌子看起来像:

表名:JsonData

列:ID、数据

我的JSON看起来像:

{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}
我想使用JSON_MODIFY来更新标识符3的示例sample1。
如何访问sample1并对其进行修改?

示例:

您的
JSON
是一个
JSON
对象数组,因此需要一个索引来访问每个元素。在这种情况下,一种可能的方法是为
JSON\u MODIFY
使用表达式作为
path
。请注意,此功能在SQL Server 2017(14.x)和Azure SQL数据库中可用。使用with default schema将
JSON
数组拆分为元素,在这种情况下,返回的列是
key
value
type

基本示例:

声明:

DECLARE @json nvarchar(max) = N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'

SELECT JSON_MODIFY(@json, '$.data[' + j.[key] + '].someData.sample1', N'NewValue') AS JsonData
FROM OPENJSON(@json, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
SELECT 
   d.ID, c.Data
FROM #Data d
CROSS APPLY (
   SELECT JSON_MODIFY(d.Data, N'$.data[' + CONVERT(nvarchar(max), j.[key] COLLATE Latin1_General_CI_AS) + N'].someData.sample1', N'NewValue') AS Data
   FROM OPENJSON(d.Data, '$.data') j
   WHERE JSON_VALUE([value], '$.identifier') = 3
) c
输出:

----------------------------
JsonData
----------------------------
{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "NewValue",
                "sample2": "test 3"
            }
        }
    ]
}
表格示例:

表:

CREATE TABLE #Data (
  ID int,
  Data nvarchar(max)
)
INSERT INTO #Data
   (ID, Data)
VALUES
   (1, N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'),
   (2, N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}')
声明:

DECLARE @json nvarchar(max) = N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'

SELECT JSON_MODIFY(@json, '$.data[' + j.[key] + '].someData.sample1', N'NewValue') AS JsonData
FROM OPENJSON(@json, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
SELECT 
   d.ID, c.Data
FROM #Data d
CROSS APPLY (
   SELECT JSON_MODIFY(d.Data, N'$.data[' + CONVERT(nvarchar(max), j.[key] COLLATE Latin1_General_CI_AS) + N'].someData.sample1', N'NewValue') AS Data
   FROM OPENJSON(d.Data, '$.data') j
   WHERE JSON_VALUE([value], '$.identifier') = 3
) c
注:


列具有BIN2排序规则,因此需要使用collate选项进行转换。

示例:

您的
JSON
是一个
JSON
对象数组,因此需要一个索引来访问每个元素。在这种情况下,一种可能的方法是为
JSON\u MODIFY
使用表达式作为
path
。请注意,此功能在SQL Server 2017(14.x)和Azure SQL数据库中可用。使用with default schema将
JSON
数组拆分为元素,在这种情况下,返回的列是
key
value
type

基本示例:

声明:

DECLARE @json nvarchar(max) = N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'

SELECT JSON_MODIFY(@json, '$.data[' + j.[key] + '].someData.sample1', N'NewValue') AS JsonData
FROM OPENJSON(@json, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
SELECT 
   d.ID, c.Data
FROM #Data d
CROSS APPLY (
   SELECT JSON_MODIFY(d.Data, N'$.data[' + CONVERT(nvarchar(max), j.[key] COLLATE Latin1_General_CI_AS) + N'].someData.sample1', N'NewValue') AS Data
   FROM OPENJSON(d.Data, '$.data') j
   WHERE JSON_VALUE([value], '$.identifier') = 3
) c
输出:

----------------------------
JsonData
----------------------------
{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "NewValue",
                "sample2": "test 3"
            }
        }
    ]
}
表格示例:

表:

CREATE TABLE #Data (
  ID int,
  Data nvarchar(max)
)
INSERT INTO #Data
   (ID, Data)
VALUES
   (1, N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'),
   (2, N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}')
声明:

DECLARE @json nvarchar(max) = N'{
    "data": [{
            "identifier": 1,
            "someData": {
                "sample1": "lorem 1",
                "sample2": "test 1"
            }
        },
        {
            "identifier": 2,
            "someData": {
                "sample1": "lorem 2",
                "sample2": "test 2"
            }
        },
        {
            "identifier": 3,
            "someData": {
                "sample1": "lorem 3",
                "sample2": "test 3"
            }
        }
    ]
}'

SELECT JSON_MODIFY(@json, '$.data[' + j.[key] + '].someData.sample1', N'NewValue') AS JsonData
FROM OPENJSON(@json, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
SELECT 
   d.ID, c.Data
FROM #Data d
CROSS APPLY (
   SELECT JSON_MODIFY(d.Data, N'$.data[' + CONVERT(nvarchar(max), j.[key] COLLATE Latin1_General_CI_AS) + N'].someData.sample1', N'NewValue') AS Data
   FROM OPENJSON(d.Data, '$.data') j
   WHERE JSON_VALUE([value], '$.identifier') = 3
) c
注:


列具有BIN2排序规则,因此您需要使用collate选项进行转换。

这是一个具有固定结构的JSON吗?总是
标识符
一些数据
样本1
样本2
?一些数据可能不同,但是标识符是常量,我想用它作为键您的SQL Server版本是什么?@Zhorov SQL Server 2017这是一个具有固定结构的JSON吗?总是
identifier
someData
sample1
sample2
?有些数据可能不同,但是标识符是常量,我想用它作为键您的SQL Server版本是什么?@Zhorov SQL Server 2017A避免难看的排序的方法:
FORMATMESSAGE(N'$.data[%s].someData.sample1',j.[key])
。如果我们有多个更新,select会给出多行。如何在修改后获得更新后的单个JSON对象。一种避免难看的排序规则的方法:
FORMATMESSAGE(N'$.data[%s].someData.sample1',j.[key])
。如果我们有多个更新,则select会给出多行。如何在修改后获得更新后的单个JSON对象。