I SQL Server kan du använda T-SQL JSON_MODIFY()
funktion för att ändra värdet på en egenskap i en JSON-sträng. Funktionen returnerar den uppdaterade JSON-strängen.
Syntax
Syntaxen ser ut så här:
JSON_MODIFY ( expression , path , newValue )
Där expression
är JSON-stränguttrycket, path
är sökvägen till egenskapen du vill uppdatera och newValue
är det nya värdet som ska tillämpas på den egenskapen.
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Resultat:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
I det här exemplet:
{"Name": "Homer"}
är den ursprungliga JSON-strängen$.Name
är sökvägen (detta börjar med$.
följt av sökvägen till egenskapen vi vill uppdatera).Bart
är det nya värdet vi vill tilldelaName
(dvs för att ersätta det aktuella värdet)
Exempel 2 – Returnera den ursprungliga och modifierade JSON
Observera att JSON_MODIFY()
ändrar inte den ursprungliga JSON. Den tar en kopia, ändrar sedan och returnerar kopian.
Här är ett exempel som visar detta:
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';
Resultat:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Exempel 3 – Kapslade egenskaper
Sökvägen kan använda punktnotation för att referera till kapslade egenskaper. Här är ett exempel.
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';
Resultat:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Så vi kan se att staden har ändrats från Dunedin
till Timaru
.
Exempel 4 – Uppdatera värden i en array
Du kan också uppdatera värden inom en array. I det här exemplet uppdaterar vi ett värde i 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';
Resultat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Eftersom arrayer använder nollbaserad numrering uppdaterar vi den tredje posten genom att referera till Hobbies[2]
.
Exempel 5 – Lägg till ett värde till en matris
I det här exemplet lägger vi till ett värde till Hobbies
array. Vi gör detta genom att lägga till append
i början av sökvägsargumentet.
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';
Resultat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Exempel 6 – Uppdatera en hel array
I det här exemplet uppdaterar jag hela arrayen.
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';
Resultat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Observera att i det här exemplet skickas det tredje argumentet till JSON_QUERY()
fungera. Om jag inte hade gjort det här, skulle SQL Server ha undkommit dubbla citattecken och hakparenteser med omvänt snedstreck (\
) tecken (och därför förstör arrayen). Det skulle ha gjort detta eftersom det inte skulle ha vetat om det uppdaterade värdet var en faktisk array eller en bokstavlig sträng.
Så för att komma runt detta kan vi använda JSON_QUERY()
. Den här funktionen returnerar giltig JSON och SQL Server kommer då att anta att det nya värdet är en array.
Här är vad som skulle ha hänt om vi inte hade gjort det använde 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';
Resultat:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Så SQL Server har undgått hakparenteser och citattecken.
Exempel 7 – Uppdatera ett helt objekt
Här är ett exempel på uppdatering av ett helt objekt.
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';
Resultat:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Återigen, om vi inte hade använt JSON_QUERY()
, skulle vi ha fått en escaped sträng:
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';
Resultat:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Exempel 8 – Byt namn på en nyckel
Du är inte bara begränsad till att uppdatera en fastighets värde, du kan också byta namn på dess nyckel. Här är ett exempel.
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
Resultat:
{"Name":"Homer"} {"Handle":"Homer"}
Här tar vi värdet från den befintliga egenskapen och tilldelar det till ett nytt nyckel/värdepar. Vi sätter sedan värdet på den ursprungliga nyckeln till NULL
(vilket automatiskt tar bort det).
För fler exempel på att byta namn på en nyckel, se Hur man byter namn på en JSON-nyckel i SQL Server.