例子:
你JSON
是一个JSON
对象数组,所以你需要一个索引来访问每个元素。在这种情况下,一种可能的方法是使用表达式作为path
参数。JSON_MODIFY
请注意,此功能在 SQL Server 2017 (14.x) 和 Azure SQL 数据库中可用。使用具有默认模式的OPENJSON将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
输出:
----------------------------
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"
}
}
]
}')
陈述:
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
笔记:
该key
列具有 BIN2 排序规则,因此您需要使用 collate 选项进行转换。