In SQL Server puoi utilizzare T-SQL JSON_MODIFY()
funzione per modificare il valore di una proprietà in una stringa JSON. La funzione restituisce la stringa JSON aggiornata.
Sintassi
La sintassi è questa:
JSON_MODIFY ( expression , path , newValue )
Dove expression
è l'espressione della stringa JSON, path
è il percorso della proprietà che desideri aggiornare e newValue
è il nuovo valore da applicare a quella proprietà.
Esempio 1:utilizzo di base
Ecco un esempio da dimostrare.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Risultato:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
In questo esempio:
{"Name": "Homer"}
è la stringa JSON originale$.Name
è il percorso (inizia con$.
seguito dal percorso della proprietà che vogliamo aggiornare).Bart
è il nuovo valore che vogliamo assegnare aName
(ovvero per sostituire il valore corrente)
Esempio 2:restituire il JSON originale e modificato
Nota che JSON_MODIFY()
non modifica il JSON originale. Prende una copia, quindi modifica e restituisce la copia.
Ecco un esempio per dimostrarlo:
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';
Risultato:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Esempio 3 – Proprietà nidificate
Il percorso può utilizzare la notazione a punti per fare riferimento a proprietà nidificate. Ecco un esempio.
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';
Risultato:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Quindi possiamo vedere che la città è stata cambiata da Dunedin
a Timaru
.
Esempio 4 – Aggiorna valori in un array
Puoi anche aggiornare i valori all'interno di una matrice. In questo esempio, aggiorniamo un valore in Hobbies
matrice.
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';
Risultato:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Poiché gli array utilizzano la numerazione in base zero, aggiorniamo il terzo elemento facendo riferimento a Hobbies[2]
.
Esempio 5:aggiungi un valore a un array
In questo esempio, aggiungiamo un valore a Hobbies
Vettore. Lo facciamo aggiungendo append
all'inizio dell'argomento del percorso.
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';
Risultato:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Esempio 6:aggiornamento di un intero array
In questo esempio, aggiorno l'intero 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';
Risultato:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Nota che in questo esempio, il terzo argomento viene passato a JSON_QUERY()
funzione. Se non l'avessi fatto, SQL Server sarebbe sfuggito alle virgolette doppie e alle parentesi quadre usando la barra rovesciata (\
) carattere (e quindi incasinando l'array). L'avrebbe fatto perché non avrebbe saputo se il valore aggiornato fosse un array effettivo o una stringa letterale.
Quindi, per aggirare questo problema, possiamo usare JSON_QUERY()
. Questa funzione restituisce un JSON valido e SQL Server presumerà quindi che il nuovo valore sia una matrice.
Ecco cosa sarebbe successo se non l'avessimo fatto usato 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';
Risultato:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Quindi SQL Server è sfuggito alle parentesi quadre e alle virgolette doppie.
Esempio 7 – Aggiorna un intero oggetto
Ecco un esempio di aggiornamento di un intero oggetto.
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';
Risultato:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Di nuovo, se non avessimo usato JSON_QUERY()
, avremmo ricevuto una stringa di 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';
Risultato:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Esempio 8 – Rinominare una chiave
Non sei solo limitato ad aggiornare il valore di una proprietà, puoi anche rinominare la sua chiave. Ecco un esempio.
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
Risultato:
{"Name":"Homer"} {"Handle":"Homer"}
Qui, prendiamo il valore dalla proprietà esistente e lo assegniamo a una nuova coppia chiave/valore. Quindi impostiamo il valore della chiave originale su NULL
(che lo cancella automaticamente).
Per altri esempi di ridenominazione di una chiave, vedere Come rinominare una chiave JSON in SQL Server.