Я задал вам несколько вопросов в комментарии выше
Два замечания: Я прав, что вы смешали старые и новые значения?И я прав, что вышеприведенный пример - всего лишь пример, и вы ищете универсальное решение, в котором обновления могут влиять на разные столбцы, возможно, даже больше, чем по одному на строку?По крайней мере, JSON допускает больше элементов в массиве объектов.
Но - в качестве начала - вы можете попробовать это:
- макет вашей установки (спасибо @Андреа, я использовал твой)
declare @people table (id int, [name] varchar(50))
insert into @people values
(1, 'John')
,(2, 'Mary')
,(3, 'Jeff')
,(4, 'Bill')
,(5, 'Bob' )
declare @json table (id int, [json] nvarchar(max))
insert into @json values
(1,'[{ "Column":"name","values": { "old": "Jeff", "new": "John"}}]')
,(2,'[{ "Column":"name","values": { "old": "Rose", "new": "Mary"}}]')
- Это - по крайней мере - вернет все, что тебе нужно.Остальное - предположительно - динамическое построение операторов и EXEC()
:
SELECT p.*
,A.[Column]
,JSON_VALUE(A.[values],'$.old') AS OldValue
,JSON_VALUE(A.[values],'$.new') As NewValue
FROM @people p
INNER JOIN @json j ON p.id=j.id
CROSS APPLY OPENJSON(j.[json])
WITH([Column] VARCHAR(100), [values] NVARCHAR(MAX) AS JSON) A;
Результат (кажется, что старое и новое ошибочно):
id name Column OldValue NewValue
1 John name Jeff John
2 Mary name Rose Mary