JSON_MODIFY (Transact-SQL)
van toepassing op: SQL Server 2016 (13.x) en hoger Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric
Hiermee wordt de waarde van een eigenschap in een JSON-tekenreeks bijgewerkt en wordt de bijgewerkte JSON-tekenreeks geretourneerd.
Transact-SQL syntaxisconventies
Syntaxis
JSON_MODIFY ( expression , path , newValue )
Argumenten
expressie
Een expressie. Meestal de naam van een variabele of een kolom die JSON-tekst bevat.
JSON_MODIFY
retourneert een fout als expressie geen geldige JSON bevat.
pad
Een JSON-padexpressie waarmee de eigenschap wordt opgegeven die moet worden bijgewerkt.
pad de volgende syntaxis heeft:
[append] [ lax | strict ] $.<json path>
toevoegen
Optionele wijziging die aangeeft dat de nieuwe waarde moet worden toegevoegd aan de matrix waarnaar wordt verwezen door
<json path>
.lax-
Hiermee geeft u op dat de eigenschap waarnaar wordt verwezen door
<json path>
niet hoeft te bestaan. Als de eigenschap niet aanwezig is, probeertJSON_MODIFY
de nieuwe waarde op het opgegeven pad in te voegen. Invoegen kan mislukken als de eigenschap niet kan worden ingevoegd op het pad. Als u geen lax- of strikteopgeeft, is lax de standaardmodus.strikte
Hiermee geeft u op dat de eigenschap waarnaar wordt verwezen door
<json path>
zich in de JSON-expressie moet bevinden. Als de eigenschap niet aanwezig is, retourneertJSON_MODIFY
een fout.<json path>
Hiermee geeft u het pad op voor de eigenschap die moet worden bijgewerkt. Zie JSON Path Expressions (SQL Server)voor meer informatie.
In SQL Server 2017 (14.x) en in Azure SQL Database kunt u een variabele opgeven als de waarde van pad.
JSON_MODIFY
retourneert een fout als de indeling van pad ongeldig is.
newValue
De nieuwe waarde voor de eigenschap die is opgegeven door pad.
De nieuwe waarde moet worden varchar, nvarchar, teken, kleineint, kleineint, int, bigint , bit, decimale/numeriekeof /. Het tekst gegevenstype wordt niet ondersteund.
In de laxmodus verwijdert JSON_MODIFY
de opgegeven sleutel als de nieuwe waarde NULL
is.
JSON_MODIFY
escapet alle speciale tekens in de nieuwe waarde als het type van de waarde varchar of nvarchar. Een tekstwaarde wordt niet escaped als deze JSON correct is opgemaakt door FOR JSON
, JSON_QUERY
of JSON_MODIFY
.
Retourwaarde
Retourneert de bijgewerkte waarde van expressie als juist opgemaakte JSON-tekst.
Opmerkingen
Met de functie JSON_MODIFY
kunt u de waarde van een bestaande eigenschap bijwerken, een nieuw sleutel:waardepaar invoegen of een sleutel verwijderen op basis van een combinatie van modi en opgegeven waarden.
In de volgende tabel wordt het gedrag van JSON_MODIFY
in de lax-modus en in de strikte modus vergeleken. Zie JSON Path Expressions (SQL Server)voor meer informatie over de specificatie van de optionele padmodus (lax of strikt).
Nieuwe waarde | Pad bestaat | Lax-modus | Strikte modus |
---|---|---|---|
NOT NULL |
Ja | Werk de bestaande waarde bij. | Werk de bestaande waarde bij. |
NOT NULL |
Nee | Probeer een nieuw sleutel-waardepaar te maken op het opgegeven pad. Dit kan mislukken. Als u bijvoorbeeld het pad opgeeft $.user.setting.theme , voegt JSON_MODIFY de sleutel niet in theme als de $.user of $.user.settings objecten niet bestaan, of als instellingen een matrix of een scalaire waarde zijn. |
Fout - INVALID_PROPERTY |
NULL |
Ja | Verwijder de bestaande eigenschap. | Stel de bestaande waarde in op null. |
NULL |
Nee | Geen actie. Het eerste argument wordt als resultaat geretourneerd. | Fout - INVALID_PROPERTY |
In de lax-modus probeert JSON_MODIFY
een nieuw sleutel:waardepaar te maken, maar in sommige gevallen kan dit mislukken.
JSON-functies werken hetzelfde, ongeacht of het JSON-document is opgeslagen in varchar, nvarcharof het systeemeigen json- gegevenstype.
Voorbeelden
Een. Basisbewerkingen
In het volgende voorbeeld ziet u basisbewerkingen die kunnen worden uitgevoerd met JSON-tekst.
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;
Dit is de resultatenset.
{
"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. Meerdere updates
Met JSON_MODIFY
kunt u slechts één eigenschap bijwerken. Als u meerdere updates moet uitvoeren, kunt u meerdere JSON_MODIFY
aanroepen gebruiken.
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;
Dit is de resultatenset.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}
C. De naam van een sleutel wijzigen
In het volgende voorbeeld ziet u hoe u de naam van een eigenschap in JSON-tekst wijzigt met de functie JSON_MODIFY
. Eerst kunt u de waarde van een bestaande eigenschap gebruiken en invoegen als een nieuw sleutel:waardepaar. Vervolgens kunt u de oude sleutel verwijderen door de waarde van de oude eigenschap in te stellen op 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;
Dit is de resultatenset.
{
"price": 49.99
} {
"Price": 49.99
}
Als u de nieuwe waarde niet naar een numeriek type cast, JSON_MODIFY
deze als tekst behandelt en tussen dubbele aanhalingstekens plaatst.
D. Een waarde verhogen
In het volgende voorbeeld ziet u hoe u de waarde van een eigenschap in JSON-tekst kunt verhogen met de functie JSON_MODIFY
. Eerst kunt u de waarde van de bestaande eigenschap gebruiken en invoegen als een nieuw sleutel:waardepaar. Vervolgens kunt u de oude sleutel verwijderen door de waarde van de oude eigenschap in te stellen op 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;
Dit is de resultatenset.
{
"click_count": 173
} {
"click_count": 174
}
E. Een JSON-object wijzigen
JSON_MODIFY
behandelt het argument newValue als tekst zonder opmaak, zelfs als deze JSON-tekst bevat. Als gevolg hiervan wordt de JSON-uitvoer van de functie omgeven door dubbele aanhalingstekens en worden alle speciale tekens ontsnapt, zoals wordt weergegeven in het volgende voorbeeld.
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;
Dit is de resultatenset.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": "[\"C#\",\"T-SQL\",\"Azure\"]"
}
Als u automatisch ontsnappen wilt voorkomen, geeft u newValue- op met behulp van de functie JSON_QUERY
.
JSON_MODIFY
weet dat de waarde die door JSON_QUERY
wordt geretourneerd, JSON correct is opgemaakt, zodat deze niet aan de waarde ontsnapt.
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;
Dit is de resultatenset.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": ["C#", "T-SQL", "Azure"]
}
F. Een JSON-kolom bijwerken
In het volgende voorbeeld wordt de waarde van een eigenschap in een tabelkolom bijgewerkt die JSON bevat.
UPDATE Employee
SET jsonCol = JSON_MODIFY(jsonCol, '$.info.address.town', 'London')
WHERE EmployeeID = 17;
Verwante inhoud
- JSON-padexpressies (SQL Server)
- JSON-gegevens in SQL Server