В 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.