Estou tentando construir uma tabela normalizada a partir de um arquivo JSON usando OPENJSON no SQL Server. O JSON tem o formato:
{
"actions":[
{"action":"delete","table":"users","key":4}],
{"action":"update","table":"users","key":5,
"fields":[{"Name":"FirstName":,"OldValue":"X","NewValue":"Bob"},
{"Name":"LastName":,"OldValue":"Y","NewValue":"Dobbs"}]
}
Meu objetivo é usar essas entradas no SQL dinâmico para produzir uma consulta funcional:
UPDATE [users] SET [FirstName]='Bob',[LastName]='Dobbs' WHERE [key]=5
Atualmente estou usando este SQL:
SELECT * FROM OPENJSON(@json, '$.actions')
WITH (
[Action] varchar(25) '$.action',
[Table] varchar(25) '$.table',
[Key] varchar(25) '$.key',
[fields] nvarchar(MAX) AS JSON
)
O que me dá resultados úteis como:
update users 5 {"name":...
Minha ideia original era usar análise de string para separar os dados em campos, mas agora percebo que é uma má ideia. Acredito que posso consultar isso de volta da tabela temporária para o analisador JSON e fazer com que ele os separe em um conjunto de linhas, mas procurei em todos os lugares e não consegui encontrar um exemplo que mostre isso.
Alguém tem algum conselho sobre como lidar com uma lista de campos de tamanhos variados?
Parece que você precisa
OUTER APPLY
separarSTRING_AGG
e reagregar afields
propriedade.Observe também
sysname
para nomes de objetos e colunas.QUOTENAME
para escapar nomes de objetos e colunas, useREPLACE
para strings longas.INSERT
, mas você deve conseguir adaptar isso.db<>violino