然而,如果JSON越复杂,它就会越复杂。JSON_MODIFY函数不能应用于UPDATE语句中的集合吗?处理复杂嵌套结构时,字符串操作可能会变得太混乱。我无法使JSON_MODIFY在更新中的集合上工作。谢谢。不幸的是,这不适用于嵌套结构。像jsonA{“

然而,如果JSON越复杂,它就会越复杂。JSON_MODIFY函数不能应用于UPDATE语句中的集合吗?处理复杂嵌套结构时,字符串操作可能会变得太混乱。我无法使JSON_MODIFY在更新中的集合上工作。谢谢。不幸的是,这不适用于嵌套结构。像jsonA{“,json,sql-server,sql-server-json,Json,Sql Server,Sql Server Json,然而,如果JSON越复杂,它就会越复杂。JSON_MODIFY函数不能应用于UPDATE语句中的集合吗?处理复杂嵌套结构时,字符串操作可能会变得太混乱。我无法使JSON_MODIFY在更新中的集合上工作。谢谢。不幸的是,这不适用于嵌套结构。像jsonA{“a”:{“a”:“a”}和jsonB{“a”:{“b”:“b”}一样,我也希望得到更优雅的解决方案。在这种情况下,您期望的输出是什么?js Object.assign也会这样做。因此,{“a”:{“b”:“b”}如我所见,append仅适用于数


然而,如果JSON越复杂,它就会越复杂。JSON_MODIFY函数不能应用于UPDATE语句中的集合吗?处理复杂嵌套结构时,字符串操作可能会变得太混乱。我无法使JSON_MODIFY在更新中的集合上工作。谢谢。不幸的是,这不适用于嵌套结构。像jsonA
{“a”:{“a”:“a”}
和jsonB
{“a”:{“b”:“b”}
一样,我也希望得到更优雅的解决方案。在这种情况下,您期望的输出是什么?js Object.assign也会这样做。因此,
{“a”:{“b”:“b”}
如我所见,append仅适用于数组。我需要合并复杂的json结构。。然后你需要做一些自定义的事情。只是一个小小的改进:你可以引用键
concat(“$”,d.[key],““”)
,这样碰巧也是数字的键字符串也可以工作(例如
{“0”:“abc”}
)。当数值不是整数时也有一个问题:它会在这里变成字符串。我认为一个好的解决方法是,当类型为2时,根据字符串(例如
1.23
转换为
decimal(3,2)
)以正确的精度转换为十进制。(不确定为什么他们将从
openjson
获得的类型称为“int”,而在JSON中它可以是十进制数。SQL Server中的JSON支持仍然需要一些改进。)
insert into mytable 
values ('{ "a": "b" ')

update mytable 
set jsonColumn = JSON_MERGE(jsonColumn, '{ "c": 2 }')
{ "a": "b", "c": 2 }
PRINT 'EXAMPLE 1

'

DECLARE @j NVARCHAR(MAX)
SET @j = '{"k" : ["a","b"] }'
PRINT @J
SET @J=JSON_MODIFY(JSON_MODIFY(@j,'append $.k','c'),'append $.k','2')
PRINT @J
GO

PRINT '
EXAMPLE 2

'

DECLARE @j NVARCHAR(MAX)
SET @j = '{"a":"b"}'
PRINT @J
SET @J=JSON_MODIFY(@J,'append $','c:2')
PRINT @J
GO
EXAMPLE 1

{"k" : ["a","b"] }
{"k" : ["a","b","c","2"] }

EXAMPLE 2

{"a":"b"}
{"a":"b"}
DECLARE @json1 nvarchar(max),
        @json2 nvarchar(max)

DECLARE @result AS nvarchar(max)

SET @json1 = N'{"a": "1", "c": "3"}'

SET @json2 = N'{"b": "2"}'

SELECT
  @result = COALESCE(@result + ', ', '') + '"' + [key] + '":"' + value + '"'
FROM (SELECT
  [key],
  value
FROM OPENJSON(@json1)
UNION ALL
SELECT
  [key],
  value
FROM OPENJSON(@json2)) AS x

SET @result = '{' + @result + '}'

PRINT @result
{"a":"1", "c":"3", "b":"2"}
{"a":1} + {"B":2} = {"a":1,"B":2}
{"x":true,"y":{"a":"b","c":"d"}} + {"y":{"a":"z"}} = {"x":true,"y":{"a":"z"}}
create function dbo.fn_json_merge
(
    @a nvarchar(max),
    @b nvarchar(max)
)
returns nvarchar(max)
as
begin
    if left(@a, 1) = '{' and left(@b, 1) = '{' begin
        select
            @a = case when d.[type] in (4,5) then json_modify(@a, concat('$.',d.[key]), json_query(d.[value])) else @a end,
            @a = case when d.[type] not in (4,5) then json_modify(@a, concat('$.',d.[key]), d.[value]) else @a end
        from openjson(@b) as d;
    end else if left(@a, 1) = '[' and left(@b, 1) = '{' begin
        select @a = json_modify(@a, 'append $', json_query(@b));
    end else begin
        select @a = concat('[', @a, ',', right(@b, len(@b) - 1));
    end;

    return @a;
end;
create function dbo.fn_json_merge
(
    @a nvarchar(max),
    @b nvarchar(max)
)
returns nvarchar(max)
as
begin
    if left(@a, 1) = '{' and left(@b, 1) = '{' begin
        select @a =
            case
                when d.[type] in (4,5) then
                    json_modify(@a, concat('$.',d.[key]), json_query(d.[value]))
                when d.[type] in (3) then
                    json_modify(@a, concat('$.',d.[key]), cast(d.[value] as bit))
                when d.[type] in (2) and try_cast(d.[value] as int) = 1 then
                    json_modify(@a, concat('$.',d.[key]), cast(d.[value] as int))
                when d.[type] in (0) then
                    json_modify(json_modify(@a, concat('lax $.',d.[key]), 'null'), concat('strict $.',d.[key]), null)
                else
                    json_modify(@a, concat('$.',d.[key]), d.[value])
            end
        from openjson(@b) as d
    end else if left(@a, 1) = '[' and left(@b, 1) = '{' begin
        select @a = json_modify(@a, 'append $', json_query(@b))
    end else begin
        select @a = concat('[', @a, ',', right(@b, len(@b) - 1))
    end

    return @a
end