Dela via


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öker JSON_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 returnerar JSON_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 varchar, nvarchar, char, tinyint, smallint, tinyint, smallint,, int, bigint, bit, decimalnumeriskaeller verkligflyttal. Datatypen text stöds inte.

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_QUERYeller 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.themeinfogar 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_MODIFYkan 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;