В SQL Server можете да използвате T-SQL JSON_MODIFY()
функция за промяна на стойността на свойство в JSON низ. Функцията връща актуализирания JSON низ.
Синтаксис
Синтаксисът е така:
JSON_MODIFY ( expression , path , newValue )
Където expression
е низовият израз на JSON, path
е пътят към свойството, което искате да актуализирате, и newValue
е новата стойност, която да се приложи към това свойство.
Пример 1 – Основна употреба
Ето пример за демонстрация.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Резултат:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
В този пример:
{"Name": "Homer"}
е оригиналният JSON низ$.Name
е пътят (това започва с$.
последвано от пътя към свойството, което искаме да актуализираме).Bart
е новата стойност, която искаме да присвоим наName
(т.е. за замяна на текущата стойност)
Пример 2 – Връщане на оригиналния и модифициран JSON
Имайте предвид, че JSON_MODIFY()
не променя оригиналния JSON. Той взема копие, след което променя и връща копието.
Ето пример за демонстриране на това:
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';
Резултат:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Пример 3 – Вложени свойства
Пътят може да използва нотация с точки за препращане към вложени свойства. Ето един пример.
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';
Резултат:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Така че можем да видим, че градът е променен от Dunedin
до Timaru
.
Пример 4 – Актуализиране на стойности в масив
Можете също да актуализирате стойности в рамките на масив. В този пример актуализираме стойност в Hobbies
масив.
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';
Резултат:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Виждайки, че масивите използват номериране на база нула, ние актуализираме третия елемент, като препращаме Hobbies[2]
.
Пример 5 – Добавяне на стойност към масив
В този пример добавяме стойност към Hobbies
масив. Правим това, като добавяме append
в началото на аргумента за пътя.
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';
Резултат:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Пример 6 – Актуализиране на цял масив
В този пример актуализирам целия масив.
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';
Резултат:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Обърнете внимание, че в този пример третият аргумент се предава на JSON_QUERY()
функция. Ако не бях направил това, SQL Server щеше да избяга от двойните кавички и квадратните скоби, използвайки обратната наклонена черта (\
) символ (и следователно объркване на масива). Щеше да направи това, защото нямаше да знае дали актуализираната стойност е действителен масив или низов литерал.
Така че, за да заобиколим това, можем да използваме JSON_QUERY()
. Тази функция връща валиден JSON и SQL Server ще приеме, че новата стойност е масив.
Ето какво щеше да се случи, ако не бяхме използва 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';
Резултат:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Така SQL Server е избягал от квадратните скоби и двойните кавички.
Пример 7 – Актуализиране на цял обект
Ето пример за актуализиране на цял обект.
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';
Резултат:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Отново, ако не бяхме използвали JSON_QUERY()
, щяхме да получим екраниран низ:
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';
Резултат:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Пример 8 – Преименуване на ключ
Не сте ограничени само до актуализиране на стойността на свойството, можете също да преименувате неговия ключ. Ето един пример.
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
Резултат:
{"Name":"Homer"} {"Handle":"Homer"}
Тук вземаме стойността от съществуващото свойство и я присвояваме на нова двойка ключ/стойност. След това задаваме стойността на оригиналния ключ на NULL
(което автоматично го изтрива).
За повече примери за преименуване на ключ вижте Как да преименувате JSON ключ в SQL Server.