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$.Namejest ścieżką (zaczyna się od$.po której następuje ścieżka do właściwości, którą chcemy zaktualizować).Bartto 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.