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.