V SQL Server můžete použít T-SQL JSON_MODIFY() funkce pro úpravu hodnoty vlastnosti v řetězci JSON. Funkce vrací aktualizovaný řetězec JSON.
Syntaxe
Syntaxe vypadá takto:
JSON_MODIFY ( expression , path , newValue )
Kde expression je výraz řetězce JSON, path je cesta k vlastnosti, kterou chcete aktualizovat, a newValue je nová hodnota, která se má na tuto vlastnost použít.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Výsledek:
+------------------+
| Result |
|------------------|
| {"Name": "Bart"} |
+------------------+
V tomto příkladu:
{"Name": "Homer"}je původní řetězec JSON$.Nameje cesta (začíná$.následovaná cestou k vlastnosti, kterou chceme aktualizovat).Bartje nová hodnota, kterou chceme přiřaditName(tj. nahradit aktuální hodnotu)
Příklad 2 – Vrácení původního a upraveného JSON
Všimněte si, že JSON_MODIFY() nemění původní JSON. Vezme kopii, poté upraví a vrátí kopii.
Zde je příklad, který to demonstruje:
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';
Výsledek:
+-------------------+-------------------+-------------------+
| Original String | Modified String | Original String |
|-------------------+-------------------+-------------------|
| {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} |
+-------------------+-------------------+-------------------+
Příklad 3 – Vnořené vlastnosti
Cesta může používat tečkovou notaci k odkazování na vnořené vlastnosti. Zde je příklad.
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';
Výsledek:
+------------------+
| Modified Array |
|------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Timaru",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
} |
+------------------+
Můžeme tedy vidět, že město bylo změněno z Dunedin na Timaru .
Příklad 4 – Aktualizace hodnot v poli
Můžete také aktualizovat hodnoty v poli. V tomto příkladu aktualizujeme hodnotu v Hobbies pole.
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';
Výsledek:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Brain Surgery"]
}
} |
+-------------------+
Vzhledem k tomu, že pole používají číslování založené na nule, aktualizujeme třetí položku odkazem na Hobbies[2] .
Příklad 5 – Připojení hodnoty k poli
V tomto příkladu připojíme hodnotu k Hobbies pole. To provedeme přidáním append na začátku argumentu cesty.
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';
Výsledek:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"]
}
} |
+-------------------+
Příklad 6 – Aktualizace celého pole
V tomto příkladu aktualizuji celé pole.
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';
Výsledek:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": ["Chess", "Brain Surgery"]
}
} |
+-------------------+
Všimněte si, že v tomto příkladu je třetí argument předán do JSON_QUERY() funkce. Kdybych to neudělal, SQL Server by dvojité uvozovky a hranaté závorky unikl pomocí zpětného lomítka (\ ) znak (a tedy zaneřádění pole). Udělal by to, protože by nevěděl, zda je aktualizovaná hodnota skutečné pole nebo řetězcový literál.
Abychom to obešli, můžeme použít JSON_QUERY() . Tato funkce vrátí platný JSON a SQL Server bude předpokládat, že nová hodnota je pole.
Co by se stalo, kdybychom nebyli použit 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';
Výsledek:
+-------------------+
| Updated Hobbies |
|-------------------|
| {
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Dunedin",
"Region": "Otago",
"Country": "New Zealand"
},
"Hobbies": "[\"Chess\", \"Brain Surgery\"]"
}
} |
+-------------------+
SQL Server tedy vynechal hranaté závorky a dvojité uvozovky.
Příklad 7 – Aktualizace celého objektu
Zde je příklad aktualizace celého objektu.
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';
Výsledek:
+------------------+
| Updated Object |
|------------------|
| {
"Suspect": {"Name": "Peter Griffin", "Hobbies": "None"}
} |
+------------------+
Znovu, pokud bychom nepoužili JSON_QUERY() , dostali bychom řetězec s escapováním:
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';
Výsledek:
+------------------+
| Updated Object |
|------------------|
| {
"Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}"
} |
+------------------+
Příklad 8 – Přejmenování klíče
Nejste omezeni pouze na aktualizaci hodnoty vlastnosti, můžete také přejmenovat její klíč. Zde je příklad.
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
Výsledek:
{"Name":"Homer"}
{"Handle":"Homer"}
Zde vezmeme hodnotu ze stávající vlastnosti a přiřadíme ji k novému páru klíč/hodnota. Poté nastavíme hodnotu původního klíče na NULL (který jej automaticky smaže).
Další příklady přejmenování klíče najdete v tématu Jak přejmenovat klíč JSON na serveru SQL.