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


JSON-adatok ellenőrzése, lekérdezése és módosítása beépített függvényekkel

Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Az SQL Database Engine JSON beépített támogatása a következő függvényeket tartalmazza:

  • Az ISJSON ellenőrzi, hogy egy sztring tartalmaz-e érvényes JSON-t.
  • JSON_VALUE Skaláris értéket nyer ki egy JSON-sztringből.
  • JSON_QUERY JSON-sztringből nyer ki egy objektumot vagy tömböt.
  • JSON_MODIFY frissíti egy tulajdonság értékét egy JSON-sztringben, és visszaadja a frissített JSON-sztringet.

Az összes JSON-függvény esetében tekintse át a JSON-függvényeket (Transact-SQL).

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

JSON-szöveg az oldalon található példákhoz

Az oldalon található példák a következő példában látható tartalomhoz hasonló JSON-szöveget használják:

{
    "id": "DesaiFamily",
    "parents": [
        { "familyName": "Desai", "givenName": "Prashanth" },
        { "familyName": "Miller", "givenName": "Helen" }
    ],
    "children": [
        {
            "familyName": "Desai",
            "givenName": "Jesse",
            "gender": "female",
            "grade": 1,
            "pets": [
                { "givenName": "Goofy" },
                { "givenName": "Shadow" }
            ]
        },
        {
            "familyName": "Desai",
            "givenName": "Lisa",
            "gender": "female",
            "grade": 8
        }
    ],
    "address": {
        "state": "NY",
        "county": "Manhattan",
        "city": "NY"
    },
    "creationDate": 1431620462,
    "isRegistered": false
}

Ez a beágyazott összetett elemeket tartalmazó JSON-dokumentum a következő mintatáblában van tárolva:

CREATE TABLE Families (
    id INT identity CONSTRAINT PK_JSON_ID PRIMARY KEY,
    [doc] NVARCHAR(MAX)
);

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.

JSON-szöveg ellenőrzése az ISJSON függvény használatával

A ISJSON függvény ellenőrzi, hogy egy sztring tartalmaz-e érvényes JSON-t.

Az alábbi példa olyan sorokat ad vissza, amelyekben a JSON oszlop érvényes JSON-szöveget tartalmaz. Explicit JSON-kényszer nélkül bármilyen szöveget beírhat az nvarchar oszlopba:

SELECT *
FROM Families
WHERE ISJSON(doc) > 0;

További információ: ISJSON (Transact-SQL).

JSON-szövegből származó érték kinyerése a JSON_VALUE függvény használatával

A JSON_VALUE függvény skaláris értéket nyer ki egy JSON-sztringből. A következő lekérdezés azokat a dokumentumokat adja vissza, ahol a id JSON mező megegyezik a DesaiFamily értékkel, city és state JSON-mezők szerint rendezve.

SELECT JSON_VALUE(f.doc, '$.id') AS Name,
    JSON_VALUE(f.doc, '$.address.city') AS City,
    JSON_VALUE(f.doc, '$.address.county') AS County
FROM Families f
WHERE JSON_VALUE(f.doc, '$.id') = N'DesaiFamily'
ORDER BY JSON_VALUE(f.doc, '$.address.city') DESC,
    JSON_VALUE(f.doc, '$.address.state') ASC

A lekérdezés eredményei az alábbi táblázatban láthatók:

Name City County
DesaiFamily NY Manhattan

További információ: JSON_VALUE.

Objektum vagy tömb kinyerése JSON-szövegből a JSON_QUERY függvény használatával

A JSON_QUERY függvény JSON-sztringből nyer ki egy objektumot vagy tömböt. Az alábbi példa bemutatja, hogyan adhat vissza JSON-töredékeket a lekérdezési eredményekben.

SELECT JSON_QUERY(f.doc, '$.address') AS Address,
    JSON_QUERY(f.doc, '$.parents') AS Parents,
    JSON_QUERY(f.doc, '$.parents[0]') AS Parent0
FROM Families f
WHERE JSON_VALUE(f.doc, '$.id') = N'DesaiFamily';

A lekérdezés eredményei az alábbi táblázatban láthatók:

Address Parents Szülő0
{ "state": "NY", "county": "Manhattan", "city": "NY" } [ { "familyName": "Desai", "givenName": "Prashanth" }, { "familyName": "Miller", "givenName": "Helen" } ] { "familyName": "Desai", "givenName": "Prashanth" }

További információ: JSON_QUERY.

Beágyazott JSON-gyűjtemények elemzése

OPENJSON függvény lehetővé teszi, hogy a JSON-alarrayt átalakítsa a sorhalmazba, majd csatlakoztassa a szülőelemhez. Például visszaadhatja az összes családi dokumentumot, és "összekapcsolhatja" őket belső JSON-tömbként tárolt objektumokkal children :

SELECT JSON_VALUE(f.doc, '$.id') AS Name,
    JSON_VALUE(f.doc, '$.address.city') AS City,
    c.givenName,
    c.grade
FROM Families f
CROSS APPLY OPENJSON(f.doc, '$.children') WITH (
    grade INT,
    givenName NVARCHAR(100)
) c

A lekérdezés eredményei az alábbi táblázatban láthatók:

Name City givenName grade
DesaiFamily NY Jesse 1
DesaiFamily NY Lisa 8

A rendszer két sort ad vissza, mert egy szülősor két gyermeksorral kapcsolódik össze, amelyek a gyermek-alarray két elemének feldolgozásával kerülnek létrehozásra. OPENJSON a függvény elemez children töredéket a doc oszlopból, és sorok halmazaként adja vissza grade-t és givenName-t az egyes elemekből. Ez a sorkészlet csatlakoztatható a szülődokumentumhoz.

Hierarchikus beágyazott JSON almezők lekérdezése

A beágyazott JSON-struktúrák lekérdezéséhez több CROSS APPLY OPENJSON hívást is alkalmazhat. Az ebben a példában használt JSON-dokumentumnak van egy children nevű beágyazott tömbje, ahol minden gyermeknek van pets nevű beágyazott tömbje. Az alábbi lekérdezés az egyes dokumentumokban lévő gyermekeket elemzi, sorként adja vissza az egyes tömbobjektumokat, majd elemzi a pets tömböt:

SELECT c.familyName,
    c.givenName AS childGivenName,
    p.givenName AS petName
FROM Families f
CROSS APPLY OPENJSON(f.doc) WITH (
    familyName NVARCHAR(100),
    children NVARCHAR(MAX) AS JSON
) AS a
CROSS APPLY OPENJSON(children) WITH (
    familyName NVARCHAR(100),
    givenName NVARCHAR(100),
    pets NVARCHAR(max) AS JSON
) AS c
OUTER APPLY OPENJSON(pets) WITH (givenName NVARCHAR(100)) AS p;

Az első OPENJSON hívás az AS JSON záradékkal visszaad egy töredéket a children tömbből. Ez a tömbtöredék a második OPENJSON függvénynek van megadva, amely az egyes gyermekek számára visszaadja givenName és firstName, valamint a pets tömböt. A pets tömb a harmadik OPENJSON függvénynek van megadva, amely visszaadja a kisállat givenName-ját.

A lekérdezés eredményei az alábbi táblázatban láthatók:

familyName gyermekKeresztneve háziállat neve
Desai Jesse Goofy
Desai Jesse Shadow
Desai Lisa NULL

A gyökérdokumentum két children sorhoz csatlakozik, amelyeket az első OPENJSON(children) hívás visszaad, így két sor (vagy tuple) alkotódik. Ezután minden sor össze lesz állítva az operátor által OPENJSON(pets)OUTER APPLY létrehozott új sorokkal. Jesse-nek két háziállata van, így (Desai, Jesse) összekapcsolva van két sorral, amelyet létrehoztak Goofy és Shadow számára. Lisa nem rendelkezik a háziállatokkal, így nincsenek sorok visszaadva OPENJSON(pets) ehhez a tushoz. Mivel azonban OUTER APPLY-t használunk, az oszlopban NULL-hez jutunk. Ha CROSS APPLY-t helyeznénk OUTER APPLY helyett, Lisa nem szerepelne az eredményben, mert nincsenek olyan háziállatsorok, amelyekkel ez a tuple összekapcsolható.

JSON_VALUE és JSON_QUERY összehasonlítása

A fő különbség a JSON_VALUE és a JSON_QUERY között az, hogy a JSON_VALUE skaláris értéket ad vissza, míg a JSON_QUERY egy objektumot vagy tömböt ad vissza.

Vegye figyelembe a következő JSON-mintaszöveget.

{
    "a": "[1,2]",
    "b": [1, 2],
    "c": "hi"
}

Ebben a JSON-mintaszövegben az "a" és a "c" adattagok sztringértékek, míg a "b" adattag egy tömb. JSON_VALUE és JSON_QUERY adja vissza a következő eredményeket:

Path JSON_VALUE visszatér JSON_QUERY visszatér
$ NULL vagy hiba { "a": "[1,2]", "b": [1, 2], "c": "hi" }
$.a [1,2] NULL vagy hiba
$.b NULL vagy hiba [1,2]
$.b[0] 1 NULL vagy hiba
$.c hi NULL vagy hiba

JSON_VALUE és JSON_QUERY tesztelése az AdventureWorks mintaadatbázissal

Tesztelje a cikkben ismertetett beépített függvényeket az alábbi példák a mintaadatbázissal való futtatásával AdventureWorks2025 . A JSON-adatok parancsfájl futtatásával történő teszteléshez való hozzáadásáról további információt a meghajtó beépített JSON-támogatásával kapcsolatos cikkben talál.

Az alábbi példákban a InfoSalesOrder_json táblázat oszlopa JSON-szöveget tartalmaz.

1. példa – Standard oszlopokat és JSON-adatokat is visszaad

Az alábbi lekérdezés a standard relációs oszlopokból és egy JSON-oszlopból származó értékeket is visszaad.

SELECT SalesOrderNumber,
    OrderDate,
    Status,
    ShipDate,
    AccountNumber,
    TotalDue,
    JSON_QUERY(Info, '$.ShippingInfo') ShippingInfo,
    JSON_QUERY(Info, '$.BillingInfo') BillingInfo,
    JSON_VALUE(Info, '$.SalesPerson.Name') SalesPerson,
    JSON_VALUE(Info, '$.ShippingInfo.City') City,
    JSON_VALUE(Info, '$.Customer.Name') Customer,
    JSON_QUERY(OrderItems, '$') OrderItems
FROM Sales.SalesOrder_json
WHERE ISJSON(Info) > 0;

2. példa – JSON-értékek összesítése és szűrése

Az alábbi lekérdezés a részösszegeket az ügyfél neve (JSON-ban tárolva) és az állapot (normál oszlopban tárolva) szerint összesíti. Ezután szűri az eredményeket város szerint (JSON-ban tárolva) és rendelési dátum szerint (normál oszlopban tárolva).

DECLARE @territoryid INT;
DECLARE @city NVARCHAR(32);

SET @territoryid = 3;
SET @city = N'Seattle';

SELECT JSON_VALUE(Info, '$.Customer.Name') AS Customer,
    Status,
    SUM(SubTotal) AS Total
FROM Sales.SalesOrder_json
WHERE TerritoryID = @territoryid
    AND JSON_VALUE(Info, '$.ShippingInfo.City') = @city
    AND OrderDate > '1/1/2015'
GROUP BY JSON_VALUE(Info, '$.Customer.Name'),
    Status
HAVING SUM(SubTotal) > 1000;

Tulajdonságértékek frissítése JSON-szövegben a JSON_MODIFY függvény használatával

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

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

SET @info = JSON_MODIFY(@jsonInfo, '$.info.address[0].town', 'London');

További információ: JSON_MODIFY.