W SQL Server możesz użyć T-SQL JSON_MODIFY()
funkcja do modyfikowania wartości właściwości w ciągu JSON. Funkcja zwraca zaktualizowany ciąg JSON.
Składnia
Składnia wygląda tak:
JSON_MODIFY ( expression , path , newValue )
Gdzie expression
jest wyrażeniem ciągu JSON, path
to ścieżka do właściwości, którą chcesz zaktualizować, a newValue
to nowa wartość do zastosowania do tej właściwości.
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Wynik:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
W tym przykładzie:
{"Name": "Homer"}
jest oryginalnym ciągiem JSON$.Name
jest ścieżką (zaczyna się od$.
po której następuje ścieżka do właściwości, którą chcemy zaktualizować).Bart
to nowa wartość, którą chcemy przypisać doName
(tj. zastąpić bieżącą wartość)
Przykład 2 – Zwróć oryginalny i zmodyfikowany JSON
Zauważ, że JSON_MODIFY()
nie modyfikuje oryginalnego JSON. Pobiera kopię, a następnie modyfikuje i zwraca kopię.
Oto przykład, który to zademonstruje:
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';
Wynik:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Przykład 3 – Właściwości zagnieżdżone
Ścieżka może używać notacji kropkowej do odwoływania się do zagnieżdżonych właściwości. Oto przykład.
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';
Wynik:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Widzimy więc, że miasto zostało zmienione z Dunedin
do Timaru
.
Przykład 4 – Aktualizacja wartości w tablicy
Możesz także aktualizować wartości w tablicy. W tym przykładzie aktualizujemy wartość w Hobbies
tablica.
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';
Wynik:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Ponieważ tablice używają numeracji od zera, aktualizujemy trzeci element, odwołując się do Hobbies[2]
.
Przykład 5 – Dołącz wartość do tablicy
W tym przykładzie dodajemy wartość do Hobbies
szyk. Robimy to, dodając append
na początku argumentu ścieżki.
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';
Wynik:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Przykład 6 – Aktualizacja całej tablicy
W tym przykładzie aktualizuję całą tablicę.
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';
Wynik:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Zauważ, że w tym przykładzie trzeci argument jest przekazywany do JSON_QUERY()
funkcjonować. Gdybym tego nie zrobił, SQL Server uniknąłby podwójnego cudzysłowu i nawiasów kwadratowych za pomocą odwrotnego ukośnika (\
) znak (a tym samym psuje tablicę). Zrobiłby to, ponieważ nie wiedziałby, czy zaktualizowana wartość jest rzeczywistą tablicą, czy literałem ciągu.
Aby obejść ten problem, możemy użyć JSON_QUERY()
. Ta funkcja zwraca poprawny JSON, a SQL Server przyjmie wtedy, że nowa wartość jest tablicą.
Oto, co by się stało, gdybyśmy nie użyto 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';
Wynik:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Tak więc SQL Server ominął nawiasy kwadratowe i podwójne cudzysłowy.
Przykład 7 – Aktualizacja całego obiektu
Oto przykład aktualizacji całego obiektu.
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';
Wynik:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Ponownie, gdybyśmy nie użyli JSON_QUERY()
, otrzymalibyśmy łańcuch ze znakami ucieczki:
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';
Wynik:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Przykład 8 – Zmień nazwę klucza
Nie ograniczasz się tylko do aktualizowania wartości właściwości, możesz również zmienić nazwę jej klucza. Oto przykład.
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
Wynik:
{"Name":"Homer"} {"Handle":"Homer"}
Tutaj pobieramy wartość z istniejącej właściwości i przypisujemy ją do nowej pary klucz/wartość. Następnie ustawiamy wartość oryginalnego klucza na NULL
(co automatycznie go usuwa).
Aby uzyskać więcej przykładów zmiany nazwy klucza, zobacz Jak zmienić nazwę klucza JSON w SQL Server.