JSON_MODIFY (Transact-SQL)
gäller för: SQL Server 2016 (13.x) och senare Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft Fabric
Uppdaterar värdet för en egenskap i en JSON-sträng och returnerar den uppdaterade JSON-strängen.
Transact-SQL syntaxkonventioner
Syntax
JSON_MODIFY ( expression , path , newValue )
Argument
uttryck
Ett uttryck. Vanligtvis namnet på en variabel eller en kolumn som innehåller JSON-text.
JSON_MODIFY
returnerar ett fel om uttryck inte innehåller giltig JSON.
sökväg
Ett JSON-sökvägsuttryck som anger den egenskap som ska uppdateras.
sökväg har följande syntax:
[append] [ lax | strict ] $.<json path>
lägg till
Valfri modifierare som anger att det nya värdet ska läggas till i matrisen som refereras av
<json path>
.slapp
Anger att egenskapen som refereras av
<json path>
inte behöver finnas. Om egenskapen inte finns försökerJSON_MODIFY
infoga det nya värdet på den angivna sökvägen. Infogningen kan misslyckas om egenskapen inte kan infogas på sökvägen. Om du inte anger slapp eller striktär slapp standardläget.strikt
Anger att egenskapen som refereras av
<json path>
måste finnas i JSON-uttrycket. Om egenskapen inte finns returnerarJSON_MODIFY
ett fel.<json path>
Anger sökvägen för egenskapen som ska uppdateras. Mer information finns i JSON Path Expressions (SQL Server).
I SQL Server 2017 (14.x) och i Azure SQL Database kan du ange en variabel som värdet för sökväg.
JSON_MODIFY
returnerar ett fel om formatet för sökväg inte är giltigt.
newValue
Det nya värdet för egenskapen som anges av sökväg.
Det nya värdet måste vara
I släpphänt läge tar JSON_MODIFY
bort den angivna nyckeln om det nya värdet är NULL
.
JSON_MODIFY
undflyr alla specialtecken i det nya värdet om värdets typ är varchar eller nvarchar. Ett textvärde är inte undantaget om det är korrekt formaterat JSON som skapats av FOR JSON
, JSON_QUERY
eller JSON_MODIFY
.
Returvärde
Returnerar det uppdaterade värdet för uttryck som korrekt formaterad JSON-text.
Anmärkningar
Med funktionen JSON_MODIFY
kan du antingen uppdatera värdet för en befintlig egenskap, infoga ett nytt nyckel:värde-par eller ta bort en nyckel baserat på en kombination av lägen och angivna värden.
I följande tabell jämförs beteendet för JSON_MODIFY
i slappt läge och i strikt läge. Mer information om den valfria sökvägslägesspecifikationen (slapp eller strikt) finns i JSON Path Expressions (SQL Server).
Nytt värde | Sökvägen finns | Släpphänt läge | Strikt läge |
---|---|---|---|
NOT NULL |
Ja | Uppdatera det befintliga värdet. | Uppdatera det befintliga värdet. |
NOT NULL |
Nej | Försök att skapa ett nytt nyckel/värde-par på den angivna sökvägen. Detta kan misslyckas. Om du till exempel anger sökvägen $.user.setting.theme infogar JSON_MODIFY inte nyckeln theme om $.user - eller $.user.settings objekten inte finns, eller om inställningarna är en matris eller ett skalärt värde. |
Fel – INVALID_PROPERTY |
NULL |
Ja | Ta bort den befintliga egenskapen. | Ange det befintliga värdet till null. |
NULL |
Nej | Ingen åtgärd. Det första argumentet returneras som resultat. | Fel – INVALID_PROPERTY |
I släpphänt läge försöker JSON_MODIFY
skapa ett nytt nyckel:värde-par, men i vissa fall kan det misslyckas.
JSON-funktioner fungerar på samma sätt oavsett om JSON-dokumentet lagras i varchar, nvarchareller den interna json datatypen.
Exempel
A. Grundläggande åtgärder
I följande exempel visas grundläggande åtgärder som kan utföras med JSON-text.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update name
SET @info = JSON_MODIFY(@info, '$.name', 'Mike');
PRINT @info;
-- Insert surname
SET @info = JSON_MODIFY(@info, '$.surname', 'Smith');
PRINT @info;
-- Set name NULL
SET @info = JSON_MODIFY(@info, 'strict $.name', NULL);
PRINT @info;
-- Delete name
SET @info = JSON_MODIFY(@info, '$.name', NULL);
PRINT @info;
-- Add skill
SET @info = JSON_MODIFY(@info, 'append $.skills', 'Azure');
PRINT @info;
Här är resultatuppsättningen.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}
B. Flera uppdateringar
Med JSON_MODIFY
kan du bara uppdatera en egenskap. Om du behöver göra flera uppdateringar kan du använda flera JSON_MODIFY
-anrop.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Multiple updates
SET @info = JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(@info, '$.name', 'Mike'), '$.surname', 'Smith'), 'append $.skills', 'Azure');
PRINT @info;
Här är resultatuppsättningen.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}
C. Byt namn på en nyckel
I följande exempel visas hur du byter namn på en egenskap i JSON-text med funktionen JSON_MODIFY
. Först kan du ta värdet för en befintlig egenskap och infoga den som ett nytt nyckel:värde-par. Sedan kan du ta bort den gamla nyckeln genom att ange värdet för den gamla egenskapen till NULL
.
DECLARE @product NVARCHAR(100) = '{"price":49.99}';
PRINT @product;
-- Rename property
SET @product = JSON_MODIFY(JSON_MODIFY(@product, '$.Price', CAST(JSON_VALUE(@product, '$.price') AS NUMERIC(4, 2))), '$.price', NULL);
PRINT @product;
Här är resultatuppsättningen.
{
"price": 49.99
} {
"Price": 49.99
}
Om du inte omvandlar det nya värdet till en numerisk typ behandlar JSON_MODIFY
det som text och omger det med dubbla citattecken.
D. Öka ett värde
I följande exempel visas hur du ökar värdet för en egenskap i JSON-text med funktionen JSON_MODIFY
. Först kan du ta värdet för den befintliga egenskapen och infoga den som ett nytt nyckel:värde-par. Sedan kan du ta bort den gamla nyckeln genom att ange värdet för den gamla egenskapen till NULL
.
DECLARE @stats NVARCHAR(100) = '{"click_count": 173}';
PRINT @stats;
-- Increment value
SET @stats = JSON_MODIFY(@stats, '$.click_count', CAST(JSON_VALUE(@stats, '$.click_count') AS INT) + 1);
PRINT @stats;
Här är resultatuppsättningen.
{
"click_count": 173
} {
"click_count": 174
}
E. Ändra ett JSON-objekt
JSON_MODIFY
behandlar argumentet newValue som oformaterad text även om det innehåller korrekt formaterad JSON-text. Därför omges JSON-utdata av funktionen med dubbla citattecken och alla specialtecken är undantagna, vilket visas i följande exempel.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update skills array
SET @info = JSON_MODIFY(@info, '$.skills', '["C#","T-SQL","Azure"]');
PRINT @info;
Här är resultatuppsättningen.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": "[\"C#\",\"T-SQL\",\"Azure\"]"
}
För att undvika automatisk utrymning anger du newValue- med hjälp av funktionen JSON_QUERY
.
JSON_MODIFY
vet att värdet som returneras av JSON_QUERY
är korrekt formaterat JSON, så att det inte tar bort värdet.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update skills array
SET @info = JSON_MODIFY(@info, '$.skills', JSON_QUERY('["C#","T-SQL","Azure"]'));
PRINT @info;
Här är resultatuppsättningen.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": ["C#", "T-SQL", "Azure"]
}
F. Uppdatera en JSON-kolumn
I följande exempel uppdateras värdet för en egenskap i en tabellkolumn som innehåller JSON.
UPDATE Employee
SET jsonCol = JSON_MODIFY(jsonCol, '$.info.address.town', 'London')
WHERE EmployeeID = 17;