Megosztás a következőn keresztül:


JSON_MODIFY (Transact-SQL)

A következőkre vonatkozik: Az SQL Server 2016 (13.x) és újabb verziói Az Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics végpontja a Microsoft FabricWarehouse-ban a Microsoft FabricSQL Database-ben a Microsoft Fabricben

A JSON_MODIFY szintaxis frissíti egy tulajdonság értékét egy JSON-sztringben, és visszaadja a frissített JSON-sztringet.

Transact-SQL szintaxis konvenciói

Syntax

JSON_MODIFY ( expression , path , newValue )

Arguments

expression

Egy kifejezés. Általában egy JSON-szöveget tartalmazó változó vagy oszlop neve.

JSON_MODIFY hibát ad vissza, ha a kifejezés nem tartalmaz érvényes JSON-t.

path

Egy JSON-elérési út kifejezés, amely megadja a frissíteni kívánt tulajdonságot.

az elérési út szintaxisa a következő:

[append] [ lax | strict ] $.<json path>
  • append

    Nem kötelező módosító, amely meghatározza, hogy az új értéket hozzá kell fűzni a <json path>által hivatkozott tömbhöz.

  • lax

    Megadja, hogy a <json path> által hivatkozott tulajdonságnak nem kell léteznie. Ha a tulajdonság nem található, JSON_MODIFY megpróbálja beszúrni az új értéket a megadott elérési útra. A beszúrás sikertelen lehet, ha a tulajdonság nem szúrható be az elérési útra. Ha nem ad meg hasadót vagy szigorúat, akkor a lax az alapértelmezett mód.

  • strict

    Megadja, hogy a <json path> által hivatkozott tulajdonságnak a JSON-kifejezésben kell lennie. Ha a tulajdonság nem található, JSON_MODIFY hibát ad vissza.

  • <json path>

    Megadja a frissíteni kívánt tulajdonság elérési útját. További információ: JSON Path Expressions.

    Az SQL Server 2017-ben (14.x) és az Azure SQL Database-ben megadhat egy változót az elérési út értékeként.

    JSON_MODIFY hibát ad vissza, ha az elérési út formátuma érvénytelen.

newValue

Az elérési út által megadott tulajdonság új értéke.

Az új értéknek varchar, nvarchar, char, tinyint, smallint, int, bigint, bit, decimális/ vagy valós/ kell lennie. A szöveges adattípus nem támogatott.

Ha az új érték JSON_MODIFY, NULL törli a megadott kulcsot.

JSON_MODIFY Az új érték összes speciális karakterét feloldja, ha az érték típusa varchar vagy nvarchar. A szöveges érték nem szökik meg, ha az FOR JSON, JSON_QUERYvagy JSON_MODIFYáltal előállított, megfelelően formázott JSON.

Visszaadott érték

A kifejezés frissített értékét adja vissza megfelelően formázott JSON-szövegként.

Remarks

A JSON_MODIFY függvény lehetővé teszi egy meglévő tulajdonság értékének frissítését, egy új kulcs:érték pár beszúrását, vagy egy kulcs törlését a módok és a megadott értékek kombinációja alapján.

Az alábbi táblázat a JSON_MODIFY viselkedését hasonlítja össze laza módban és szigorú módban. Az opcionális elérésiút-mód specifikációjáról (lax vagy szigorú) további információt a JSON-elérésiút-kifejezésekben talál.

Új érték Az út létezik Lax mód Szigorú mód
NOT NULL Yes Frissítse a meglévő értéket. Frissítse a meglévő értéket.
NOT NULL No Próbáljon meg létrehozni egy új kulcs-érték párot a megadott útvonalon.

Ez sikertelen lehet. Ha például megadja az elérési utat $.user.setting.theme, JSON_MODIFY nem szúrja be a kulcsot theme, ha a $.user vagy $.user.settings objektumok nem léteznek, vagy ha a beállítások tömb vagy skaláris érték.
Hiba – INVALID_PROPERTY
NULL Yes Törölje a meglévő tulajdonságot. Állítsa a meglévő értéket null értékre.
NULL No Nincs művelet. Az első argumentum eredményként lesz visszaadva. Hiba – INVALID_PROPERTY

Lax módban JSON_MODIFY megpróbál létrehozni egy új kulcs:érték párot, de bizonyos esetekben sikertelen lehet.

A JSON-függvények ugyanúgy működnek, függetlenül attól, hogy a JSON-dokumentum varcharban, nvarcharban vagy natív JSON-adattípusban van tárolva.

Examples

A. Alapszintű műveletek

Az alábbi példa jSON-szöveggel elvégezhető alapműveleteket mutat be.

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;

Itt van az eredményhalmaz.

{
    "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. Többszörös frissítés

A JSON_MODIFYcsak egy tulajdonságot frissíthet. Ha több frissítést kell végrehajtania, több JSON_MODIFY hívást is használhat.

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;

Itt van az eredményhalmaz.

{
    "name": "John",
    "skills": ["C#", "SQL"]
} {
    "name": "Mike",
    "skills": ["C#", "SQL", "Azure"],
    "surname": "Smith"
}

C. Kulcs átnevezése

Az alábbi példa bemutatja, hogyan nevezhet át egy tulajdonságot JSON-szövegben a JSON_MODIFY függvénnyel. Először felveheti egy meglévő tulajdonság értékét, és beszúrhatja új kulcs:érték párként. Ezután törölheti a régi kulcsot, ha a régi tulajdonság értékét NULLértékre állítja.

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;

Itt van az eredményhalmaz.

{
    "price": 49.99
} {
    "Price": 49.99
}

Ha az új értéket nem numerikus típusra veti, JSON_MODIFY szövegként kezeli, és dupla idézőjelekkel veszi körül.

D. Érték növelése

Az alábbi példa bemutatja, hogyan növelheti egy tulajdonság értékét JSON-szövegben a JSON_MODIFY függvénnyel. Először felveheti a meglévő tulajdonság értékét, és beszúrhatja új kulcs:érték párként. Ezután törölheti a régi kulcsot, ha a régi tulajdonság értékét NULLértékre állítja.

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;

Itt van az eredményhalmaz.

{
    "click_count": 173
} {
    "click_count": 174
}

E. JSON-objektum módosítása

JSON_MODIFY a newValue argumentumot egyszerű szövegként kezeli akkor is, ha megfelelően formázott JSON-szöveget tartalmaz. Ennek eredményeképpen a függvény JSON-kimenete kettős idézőjelekkel van körülvéve, és az összes speciális karakter megmenekül, ahogy az alábbi példában is látható.

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;

Itt van az eredményhalmaz.

{
    "name": "John",
    "skills": ["C#", "SQL"]
} {
    "name": "John",
    "skills": "[\"C#\",\"T-SQL\",\"Azure\"]"
}

Az automatikus menekülés elkerülése érdekében adja meg a newValue értéket a JSON_QUERY függvény használatával. JSON_MODIFY tudja, hogy a JSON_QUERY által visszaadott érték megfelelően formázott JSON, így nem kerüli el az értéket.

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;

Itt van az eredményhalmaz.

{
    "name": "John",
    "skills": ["C#", "SQL"]
} {
    "name": "John",
    "skills": ["C#", "T-SQL", "Azure"]
}

F. JSON-oszlop frissítése

Az alábbi példa egy JSON-t tartalmazó táblaoszlopban lévő tulajdonság értékét frissíti.

UPDATE Employee
SET jsonCol = JSON_MODIFY(jsonCol, '$.info.address.town', 'London')
WHERE EmployeeID = 17;