No SQL Server, você pode usar o T-SQL
JSON_MODIFY() função para modificar o valor de uma propriedade em uma string JSON. A função retorna a string JSON atualizada. Sintaxe
A sintaxe fica assim:
JSON_MODIFY ( expression , path , newValue )
Onde
expression é a expressão de string JSON, path é o caminho para a propriedade que você deseja atualizar e newValue é o novo valor a ser aplicado a essa propriedade. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Resultado:
+------------------+
| Result |
|------------------|
| {"Name": "Bart"} |
+------------------+
Neste exemplo:
{"Name": "Homer"}é a string JSON original$.Nameé o caminho (começa com$.seguido pelo caminho para a propriedade que queremos atualizar).Barté o novo valor que queremos atribuir aName(ou seja, para substituir o valor atual)
Exemplo 2 – Retornar o JSON original e modificado
Observe que
JSON_MODIFY() não modifica o JSON original. Ele faz uma cópia, depois modifica e retorna a cópia. Aqui está um exemplo para demonstrar isso:
DECLARE @suspect NVARCHAR(4000)
SET @suspect= '{"Name": "Homer"}'
SELECT
@suspect AS 'Original String',
JSON_MODIFY(@suspect, '$.Name', 'Bart') AS 'Modified String',
@suspect AS 'Original String';
Resultado:
+-------------------+-------------------+-------------------+
| Original String | Modified String | Original String |
|-------------------+-------------------+-------------------|
| {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} |
+-------------------+-------------------+-------------------+
Exemplo 3 – Propriedades aninhadas
O caminho pode usar notação de ponto para fazer referência a propriedades aninhadas. Aqui está um exemplo.
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect.Address.City', 'Timaru') AS 'Modified Array';
Resultado:
+------------------+
| Modified Array |
|------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Timaru",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
} |
+------------------+
Assim, podemos ver que a cidade foi alterada de
Dunedin para Timaru . Exemplo 4 – Atualizar valores em uma matriz
Você também pode atualizar valores em uma matriz. Neste exemplo, atualizamos um valor no arquivo
Hobbies variedade. DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect.Hobbies[2]', 'Brain Surgery') AS 'Updated Hobbies';
Resultado:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Brain Surgery"]
}
} |
+-------------------+
Visto que os arrays usam numeração baseada em zero, atualizamos o terceiro item referenciando
Hobbies[2] . Exemplo 5 – Anexar um valor a uma matriz
Neste exemplo, anexamos um valor ao campo
Hobbies variedade. Fazemos isso adicionando append no início do argumento de caminho. DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'append $.Suspect.Hobbies', 'Brain Surgery') AS 'Updated Hobbies';
Resultado:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"]
}
} |
+-------------------+
Exemplo 6 – Atualizar uma matriz inteira
Neste exemplo, atualizo todo o array.
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect.Hobbies', JSON_QUERY('["Chess", "Brain Surgery"]')) AS 'Updated Hobbies';
Resultado:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Chess", "Brain Surgery"]
}
} |
+-------------------+
Observe que neste exemplo, o terceiro argumento é passado para o
JSON_QUERY() função. Se eu não tivesse feito isso, o SQL Server teria escapado das aspas duplas e colchetes usando a barra invertida (\ ) (e, portanto, bagunçando o array). Ele teria feito isso porque não saberia se o valor atualizado era um array real ou um literal de string. Então, para contornar isso, podemos usar
JSON_QUERY() . Essa função retorna um JSON válido e o SQL Server assumirá que o novo valor é uma matriz. Veja o que teria acontecido se não tivéssemos usou
JSON_QUERY() :DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect.Hobbies', '["Chess", "Brain Surgery"]') AS 'Updated Hobbies';
Resultado:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": "[\"Chess\", \"Brain Surgery\"]"
}
} |
+-------------------+
Portanto, o SQL Server escapou dos colchetes e aspas duplas.
Exemplo 7 – Atualizar um objeto inteiro
Aqui está um exemplo de atualização de um objeto inteiro.
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect', JSON_QUERY('{"Name": "Peter Griffin", "Hobbies": "None"}')) AS 'Updated Object';
Resultado:
+------------------+
| Updated Object |
|------------------|
| {
"Suspect": {"Name": "Peter Griffin", "Hobbies": "None"}
} |
+------------------+
Novamente, se não tivéssemos usado
JSON_QUERY() , teríamos recebido uma string de escape:DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_MODIFY(@data,'$.Suspect', '{"Name": "Peter Griffin", "Hobbies": "None"}') AS 'Updated Object';
Resultado:
+------------------+
| Updated Object |
|------------------|
| {
"Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}"
} |
+------------------+
Exemplo 8 – Renomear uma chave
Você não está limitado apenas a atualizar o valor de uma propriedade, você também pode renomear sua chave. Aqui está um exemplo.
DECLARE @data NVARCHAR(50)='{"Name":"Homer"}'
PRINT @data
-- Rename the key
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')),
'$.Name',
NULL
)
PRINT @data
Resultado:
{"Name":"Homer"}
{"Handle":"Homer"}
Aqui, pegamos o valor da propriedade existente e o atribuímos a um novo par chave/valor. Em seguida, definimos o valor da chave original para
NULL (que o exclui automaticamente). Para obter mais exemplos de renomeação de uma chave, consulte Como renomear uma chave JSON no SQL Server.