In SQL Server kunt u de T-SQL JSON_MODIFY()
gebruiken functie om de waarde van een eigenschap in een JSON-tekenreeks te wijzigen. De functie retourneert de bijgewerkte JSON-tekenreeks.
Syntaxis
De syntaxis gaat als volgt:
JSON_MODIFY ( expression , path , newValue )
Waar expression
is de JSON-tekenreeksexpressie, path
is het pad naar de eigenschap die u wilt bijwerken, en newValue
is de nieuwe waarde die op die eigenschap moet worden toegepast.
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld om te demonstreren.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Resultaat:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
In dit voorbeeld:
{"Name": "Homer"}
is de originele JSON-tekenreeks$.Name
is het pad (dit begint met$.
gevolgd door het pad naar de eigenschap die we willen bijwerken).Bart
is de nieuwe waarde die we willen toewijzen aanName
(d.w.z. om de huidige waarde te vervangen)
Voorbeeld 2 – Retourneer de originele en gewijzigde JSON
Merk op dat JSON_MODIFY()
wijzigt de originele JSON niet. Er wordt een kopie gemaakt, vervolgens wordt de kopie gewijzigd en geretourneerd.
Hier is een voorbeeld om dit aan te tonen:
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';
Resultaat:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Voorbeeld 3 – Geneste eigenschappen
Het pad kan puntnotatie gebruiken om te verwijzen naar geneste eigenschappen. Hier is een voorbeeld.
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';
Resultaat:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Dus we kunnen zien dat de stad is veranderd van Dunedin
naar Timaru
.
Voorbeeld 4 – Waarden in een array bijwerken
U kunt ook waarden binnen een array bijwerken. In dit voorbeeld werken we een waarde bij in de Hobbies
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[2]', 'Brain Surgery') AS 'Updated Hobbies';
Resultaat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Aangezien arrays op nul gebaseerde nummering gebruiken, werken we het derde item bij door te verwijzen naar Hobbies[2]
.
Voorbeeld 5 – Een waarde toevoegen aan een array
In dit voorbeeld voegen we een waarde toe aan de Hobbies
reeks. Dit doen we door append
. toe te voegen aan het begin van het padargument.
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';
Resultaat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Voorbeeld 6 – Een hele array bijwerken
In dit voorbeeld werk ik de hele array bij.
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';
Resultaat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Merk op dat in dit voorbeeld het derde argument wordt doorgegeven aan de JSON_QUERY()
functie. Als ik dit niet had gedaan, zou SQL Server zijn ontsnapt aan de dubbele aanhalingstekens en vierkante haken met behulp van de backslash (\
) teken (en daardoor de array in de war sturen). Het zou dit hebben gedaan omdat het niet zou weten of de bijgewerkte waarde een echte array was, of een letterlijke tekenreeks.
Dus om dit te omzeilen, kunnen we JSON_QUERY()
. gebruiken . Deze functie retourneert geldige JSON en SQL Server gaat er dan vanuit dat de nieuwe waarde een array is.
Dit is wat er zou zijn gebeurd als we niet hadden gedaan gebruikte 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';
Resultaat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Dus SQL Server is ontsnapt aan de vierkante haken en dubbele aanhalingstekens.
Voorbeeld 7 – Een heel object bijwerken
Hier is een voorbeeld van het bijwerken van een heel object.
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';
Resultaat:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Nogmaals, als we JSON_QUERY()
. niet hadden gebruikt , zouden we een escape-tekenreeks hebben ontvangen:
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';
Resultaat:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Voorbeeld 8 – De naam van een toets wijzigen
U bent niet alleen beperkt tot het bijwerken van de waarde van een eigenschap, u kunt ook de sleutel ervan hernoemen. Hier is een voorbeeld.
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
Resultaat:
{"Name":"Homer"} {"Handle":"Homer"}
Hier nemen we de waarde van de bestaande eigenschap en wijzen deze toe aan een nieuw sleutel/waarde-paar. Vervolgens stellen we de waarde van de originele sleutel in op NULL
(waardoor het automatisch wordt verwijderd).
Voor meer voorbeelden van het hernoemen van een sleutel, zie Een JSON-sleutel hernoemen in SQL Server.