Delen via


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, probeert JSON_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, retourneert JSON_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 NULLis.

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_QUERYof 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_MODIFYkunt 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;