Original answer:
I don't think, that you can merge two JSON arrays with one JSON_MODIFY() call, but the following statement (using JSON_MODIFY()) is a possible solution:
Statement:
DECLARE @json NVARCHAR(500) = N'[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]'
DECLARE @new NVARCHAR(500) = N'[{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]'
SELECT @json = JSON_MODIFY(
@json,
'append $',
JSON_QUERY([value])
)
FROM OPENJSON(@new)
SELECT @json
Result:
[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"},{"id": 3, "data": "Three"},{"id": 4, "data": "Four"}]
Update:
SQL Server 2025 will introduce some new JSON features and one of them is the JSON_ARRAYAGG() function:
DECLARE @old NVARCHAR(max) = N'[{"id": 1, "data": "One"}, {"id": 2, "data": "Two"}]'
DECLARE @new NVARCHAR(max) = N'[{"id": 3, "data": "Three"}, {"id": 4, "data": "Four"}]'
DECLARE @json NVARCHAR(max)
SELECT @json = JSON_ARRAYAGG([value])
FROM (
SELECT JSON_QUERY([value]) AS [value]
FROM OPENJSON(@old)
UNION ALL
SELECT JSON_QUERY([value]) AS [value]
FROM OPENJSON(@new)
) t
SELECT @json
Result:
[{"id": 1, "data": "One"},{"id": 2, "data": "Two"},{"id": 3, "data": "Three"},{"id": 4, "data": "Four"}]
With this approach you can easily parse and aggregate JSON arrays containing scalar values (not JSON objects) with defined data type:
DECLARE @old NVARCHAR(max) = N'[1, 2]'
DECLARE @new NVARCHAR(max) = N'[3, 4]'
DECLARE @json NVARCHAR(max)
SELECT @json = JSON_ARRAYAGG([value])
FROM (
SELECT [value]
FROM OPENJSON(@old) WITH ([value] int '$')
UNION ALL
SELECT [value]
FROM OPENJSON(@new) WITH ([value] int '$')
) t
SELECT @json
Result:
[1,2,3,4]