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


JSON-adatok az SQL Serveren

A következőkre vonatkozik: SQL Server 2016 (13.x) és újabb verziók Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Database a Microsoft Fabric

Ez a cikk áttekintést nyújt az SQL Server, az Azure SQL Database, az Azure SQL Managed Instance, az Azure Synapse Analytics és a Microsoft Fabric SQL Database JSON szöveges adatformátumáról.

Megjegyzés:

Áttekintés

A JSON egy népszerű szöveges adatformátum, amely modern webes és mobilalkalmazásokban történő adatcserére szolgál. A JSON-t a strukturálatlan adatok naplófájlokban vagy NoSQL-adatbázisokban, például a Microsoft Azure Cosmos DB-ben való tárolására is használják. Számos REST-webszolgáltatás JSON-szövegként formázott eredményeket ad vissza, vagy JSON-ként formázott adatokat fogad el. A legtöbb Azure-szolgáltatás, például az Azure Search, az Azure Storage és az Azure Cosmos DB például REST-végpontokkal rendelkezik, amelyek JSON-t adnak vissza vagy használnak fel. A JSON a weblapok és webkiszolgálók közötti adatcsere fő formátuma AJAX-hívások használatával.

Az SQL Server 2016-ban (13.x) először bevezetett JSON-függvények lehetővé teszik a NoSQL és a relációs fogalmak kombinálására ugyanabban az adatbázisban. Kombinálhatja a klasszikus relációs oszlopokat olyan oszlopokkal, amelyek ugyanabban a táblában JSON-szövegként formázott dokumentumokat tartalmaznak, elemezheti és importálhatja a JSON-dokumentumokat relációs struktúrákban, vagy formázhatja a relációs adatokat JSON-szöveggé.

Az alábbi példa JSON-szövegre mutat be:

[
    {
        "name": "John",
        "skills": [ "SQL", "C#", "Azure" ]
    },
    {
        "name": "Jane",
        "surname": "Doe"
    }
]

Az SQL Server beépített függvényeinek és operátorainak használatával a következő műveleteket hajthatja végre JSON-szöveggel:

  • JSON-szöveg elemzése és értékek olvasása vagy módosítása.
  • JSON-objektumok tömbjei táblázatos formátumba alakítása.
  • Futtasson bármilyen Transact-SQL lekérdezést a konvertált JSON-objektumokon.
  • A Transact-SQL lekérdezések eredményeit JSON formátumban formázza.

A beépített JSON-támogatás áttekintését bemutató ábra.

SQL Server 2025-módosítások

Az SQL Server 2025 (17.x) előzetes verziója a következő JSON-fejlesztéseket mutatja be, mindegyik jelenleg előzetes verzióban érhető el:

Főbb JSON-képességek

A következő szakaszok az SQL Server beépített JSON-támogatásával biztosított fő képességeket ismertetik.

JSON-adattípus

Az új JSON-adattípus , amely natív bináris formátumban tárolja a JSON-dokumentumokat, amely a következő előnyöket nyújtja a JSON-adatok varchar/nvarcharban való tárolásához:

  • Hatékonyabb olvasás, mivel a dokumentum már elemzésre került
  • Hatékonyabb írás, mivel a lekérdezés a teljes dokumentum elérése nélkül is frissítheti az egyes értékeket
  • Hatékonyabb tárolás tömörítésre optimalizálva
  • Nincs változás a meglévő kóddal való kompatibilitásban

Megjegyzés:

A JSON-adattípus:

  • Általánosan elérhető az Azure SQL Database és az Always-up-todátumfrissítési szabályzattal konfigurált felügyelt Azure SQL-példány esetében.
  • előzetes verzióban érhető el az SQL Server 2025 (17.x) előzetes verziója.

A JSON-adattípus lekérdezésének leghatékonyabb módja továbbra is a cikkben ismertetett JSON-függvények használata. A natív JSON-adattípusról további információt a JSON-adattípusban talál.

JSON-szöveg értékeinek kinyerés és lekérdezésekben való használata

Ha adatbázistáblákban tárolt JSON-szövegekkel rendelkezik, a JSON-szöveg értékeit az alábbi beépített függvényekkel olvashatja vagy módosíthatja:

Példa

Az alábbi példában a lekérdezés relációs és JSON-adatokat is használ (egy nevesített jsonColoszlopban tárolva) a következő nevű Peopletáblából:

SELECT Name,
    Surname,
    JSON_VALUE(jsonCol, '$.info.address.PostCode') AS PostCode,
    JSON_VALUE(jsonCol, '$.info.address."Address Line 1"')
        + ' ' + JSON_VALUE(jsonCol, '$.info.address."Address Line 2"') AS Address,
    JSON_QUERY(jsonCol, '$.info.skills') AS Skills
FROM People
WHERE ISJSON(jsonCol) > 0
    AND JSON_VALUE(jsonCol, '$.info.address.Town') = 'Belgrade'
    AND STATUS = 'Active'
ORDER BY JSON_VALUE(jsonCol, '$.info.address.PostCode');

Az alkalmazások és eszközök nem látnak különbséget a skaláris táblaoszlopokból és a JSON-oszlopokból vett értékek között. A JSON-szöveg értékeit a Transact-SQL lekérdezés bármely részében használhatja (beleértve a WHERE, ORDER BY vagy GROUP BY záradékokat, ablakösszesítéseket stb.). A JSON-függvények JavaScript-szerű szintaxist használnak a JSON-szövegben lévő értékekre való hivatkozáshoz.

További információ: JSON-adatok érvényesítése, lekérdezése és módosítása beépített függvényekkel (SQL Server),JSON_VALUE (Transact-SQL), valamint JSON_QUERY (Transact-SQL).

JSON-értékek módosítása

Ha módosítania kell a JSON-szöveg egyes részeit, a JSON_MODIFY (Transact-SQL) függvénnyel frissítheti egy tulajdonság értékét egy JSON-sztringben, és visszaadhatja a frissített JSON-sztringet. Az alábbi példa egy JSON-t tartalmazó változó tulajdonságának értékét frissíti:

DECLARE @json NVARCHAR(MAX);

SET @json = '{"info": {"address": [{"town": "Belgrade"}, {"town": "Paris"}, {"town":"Madrid"}]}}';
SET @json = JSON_MODIFY(@json, '$.info.address[1].town', 'London');

SELECT modifiedJson = @json;

Itt van az eredmények összessége.

{"info":{"address":[{"town":"Belgrade"},{"town":"London"},{"town":"Madrid"}]}}

JSON-gyűjtemények átalakítása sorkészletté

Az SQL Server JSON-lekérdezéséhez nincs szükség egyéni lekérdezési nyelvre. A JSON-adatok lekérdezéséhez használhatja a standard T-SQL-t. Ha JSON-adatokra vonatkozó lekérdezést vagy jelentést kell létrehoznia, a JSON-adatokat egyszerűen sorokká és oszlopokká alakíthatja a OPENJSON sorhalmazfüggvény meghívásával. További információ: JSON-adatok elemzése és átalakítása OPENJSON használatával.

Az alábbi példa meghívja OPENJSON és átalakítja a változóban @json tárolt objektumtömböt egy olyan sorhalmazra, amely szabványos Transact-SQL SELECT utasítással kérdezhető le:

DECLARE @json NVARCHAR(MAX);

SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT *
FROM OPENJSON(@json) WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob'
);

Itt van az eredmények összessége.

ID (Azonosító) keresztnév vezetéknév életkor születésiDátum
2 John Béla 25
5 Jane Béla 2005-11-04T12:00:00

OPENJSON A JSON-objektumok tömbje olyan táblázattá alakul, amelyben minden objektum egy sorként jelenik meg, a kulcs-érték párok pedig cellákként jelennek meg. A kimenet a következő szabályokat követi:

  • OPENJSON A JSON-értékeket a záradékban WITH megadott típusokká alakítja.
  • OPENJSON képes kezelni az egykulcsos/érték párokat és a beágyazott, hierarchikusan rendszerezett objektumokat.
  • Nem kell visszaadnia a JSON-szövegben található összes mezőt.
  • Ha a JSON-értékek nem léteznek, OPENJSON az értékeket NULL adja vissza.
  • Megadhat egy elérési utat a típus specifikációja után, hogy beágyazott tulajdonságra hivatkozzon, vagy egy másik névvel hivatkozzon egy tulajdonságra.
  • Az elérési út opcionális strict előtagja azt határozza meg, hogy a megadott tulajdonságok értékeinek meg kell létezniük a JSON-szövegben.

További információ: JSON-adatok elemzése és átalakítása OPENJSON és OPENJSON (Transact-SQL) használatával.

A JSON-dokumentumok alelemekkel és hierarchikus adatokkal rendelkezhetnek, amelyeket nem lehet közvetlenül leképezni a standard relációs oszlopokba. Ebben az esetben összesimíthatja a JSON-hierarchiát a szülő entitás altömbökkel való összekapcsolásával.

Az alábbi példában a tömb második objektuma a személyismereteket képviselő altömböt tartalmazza. Minden alobjektum további függvényhívással OPENJSON elemezhető:

DECLARE @json NVARCHAR(MAX);

SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith", "skills": ["SQL", "C#", "Azure"]}, "dob": "2005-11-04T12:00:00"}
]';

SELECT id,
    firstName,
    lastName,
    age,
    dateOfBirth,
    skill
FROM OPENJSON(@json) WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob',
    skills NVARCHAR(MAX) '$.info.skills' AS JSON
)
OUTER APPLY OPENJSON(skills) WITH (skill NVARCHAR(8) '$');

A skills tömb az első OPENJSON eredeti JSON szövegtöredékként lesz visszaadva, és a OPENJSON függvénynek egy APPLY operátor használatával kerül átadásra. A második OPENJSON függvény elemzi a JSON-tömböt, és sztringértékeket ad vissza egyetlen oszlopsorkészletként, amely az első OPENJSONeredményhez lesz csatlakoztatva.

Itt van az eredmények összessége.

ID (Azonosító) keresztnév vezetéknév életkor születésiDátum készség
2 John Béla 25
5 Jane Béla 2005-11-04T12:00:00 SQL
5 Jane Béla 2005-11-04T12:00:00 C#
5 Jane Béla 2005-11-04T12:00:00 Azúrkék

OUTER APPLY OPENJSON összekapcsolja az első szintű entitást egy altömbbel, és egyszintű eredményhalmazt ad vissza. A JOIN miatt a második sor minden képességnél ismétlődik.

SQL Server-adatok átalakítása JSON-ra vagy JSON exportálása

Megjegyzés:

Az Azure Synapse Analytics-adatok JSON-ra konvertálása vagy A JSON exportálása nem támogatott.

Az SQL Server-adatok vagy az SQL-lekérdezések eredményeinek JSON-ként való formázásához vegye fel a FOR JSON záradékot egy SELECT utasításba. Az FOR JSON ügyfélalkalmazások JSON-kimenetének formázását az SQL Serverre delegálhatja. További információ: Lekérdezési eredmények formázása JSON-ként a FOR JSON használatával.

Az alábbi példa a PATH módot használja a FOR JSON záradékkal:

SELECT id,
    firstName AS "info.name",
    lastName AS "info.surname",
    age,
    dateOfBirth AS dob
FROM People
FOR JSON PATH;

A FOR JSON záradék az SQL-eredményeket JSON-szövegként formázja, amely bármely, a JSON-t ismerő alkalmazás számára elérhető. A PATH beállítás pontokkal tagolt aliasokat használ a SELECT záradékban az objektumok lekérdezési eredményekbe való beágyazásához.

Itt van az eredmények összessége.

[
  {
    "id": 2,
    "info": {
      "name": "John",
      "surname": "Smith"
    },
    "age": 25
  },
  {
    "id": 5,
    "info": {
      "name": "Jane",
      "surname": "Smith"
    },
    "dob": "2005-11-04T12:00:00"
  }
]

További információ: Lekérdezési eredmények formázása JSON-ként a FOR JSON és a FOR Záradék (Transact-SQL) használatával.

JSON-adatok aggregátumokból

A JSON aggregátumfüggvények lehetővé teszik JSON-objektumok vagy tömbök sql-adatokból származó összesítésen alapuló felépítését.

  • JSON_OBJECTAGG egy JSON-objektumot hoz létre SQL-adatok vagy oszlopok összesítéséből.
  • JSON_ARRAYAGG egy JSON-tömböt hoz létre SQL-adatok vagy oszlopok összesítéséből.

Megjegyzés:

json összesítő függvények JSON_OBJECTAGG és JSON_ARRAYAGG jelenleg előzetes verzióban érhetők el az Azure SQL Database és a felügyelt Azure SQL-példány esetében (a Always-up-to-date frissítési szabályzat).

JSON-adatok használati esetei az SQL Serveren

A JSON-támogatás az SQL Serverben és az Azure SQL Database-ben lehetővé teszi a relációs és NoSQL fogalmak kombinálását. A relációs adatokat egyszerűen átalakíthatja részben strukturált adatokká, és fordítva. A JSON azonban nem helyettesíti a meglévő relációs modelleket. Íme néhány konkrét használati eset, amelyek az SQL Server és az SQL Database JSON-támogatásának előnyeit élvezik.

Összetett adatmodellek egyszerűsítése

Fontolja meg az adatmodell denormalizálását JSON-mezőkkel több gyermektábla helyett.

Kiskereskedelmi és e-kereskedelmi adatok tárolása

A rugalmasság érdekében tároljon információkat a denormalizált modell változó attribútumainak széles skáláját tartalmazó termékekről.

Napló- és telemetriaadatok feldolgozása

JSON-fájlként tárolt naplóadatok betöltése, lekérdezése és elemzése a Transact-SQL nyelv minden erejével.

Részben strukturált IoT-adatok tárolása

Ha valós idejű elemzésre van szüksége az IoT-adatokról, töltse be a bejövő adatokat közvetlenül az adatbázisba ahelyett, hogy tárolóhelyen helyeznék el őket.

A REST API fejlesztésének egyszerűsítése

Az adatbázisból származó relációs adatokat egyszerűen alakíthatja át a webhelyet támogató REST API-k által használt JSON formátumba.

Relációs és JSON-adatok egyesítése

Az SQL Server hibrid modellt biztosít a relációs és JSON-adatok tárolásához és feldolgozásához standard Transact-SQL nyelv használatával. A JSON-dokumentumok gyűjteményeit táblákba rendezheti, kapcsolatokat létesíthet közöttük, kombinálhatja a táblákban tárolt, erősen gépelt skaláris oszlopokat a JSON-oszlopokban tárolt rugalmas kulcs-/érték párokkal, és a teljes Transact-SQL használatával lekérdezheti a skaláris és a JSON-értékeket egy vagy több táblában.

A JSON szöveg a VARCHAR vagy NVARCHAR oszlopokban van tárolva, és egyszerű szövegként van indexelve. A JSON-t minden olyan SQL Server-funkció vagy összetevő támogatja, amely támogatja a JSON-t, így a JSON és más SQL Server-funkciók közötti interakció szinte semmilyen korlátozással nem jár. A JSON-t memóriában vagy temporális táblákban tárolhatja, Row-Level biztonsági predikátumokat alkalmazhat JSON-szövegre stb.

Íme néhány használati eset, amely bemutatja, hogyan használhatja a beépített JSON-támogatást az SQL Serverben.

JSON-adatok tárolása és indexelése az SQL Serveren

A JSON szöveges formátum, így a JSON-dokumentumok egy SQL Database oszlopaiban NVARCHAR tárolhatók. Mivel NVARCHAR a típus minden SQL Server-alrendszerben támogatott, A JSON-dokumentumokat fürtözött oszlopcentrikus indexekkel, memóriaoptimalizált táblákkal vagy openROWSET vagy PolyBase használatával olvasható külső fájlokkal rendelkező táblákba helyezheti.

A JSON-adatok SQL Serveren való tárolására, indexelésére és optimalizálására vonatkozó lehetőségekről az alábbi cikkekben olvashat bővebben:

JSON-fájlok betöltése az SQL Serverbe

A fájlokban tárolt információkat szabványos JSON-ként vagy vonallal tagolt JSON-ként formázhatja. Az SQL Server importálhatja a JSON-fájlok tartalmát, a OPENJSON vagy JSON_VALUE függvények használatával elemezheti, és betöltheti a táblákba.

  • Ha A JSON-dokumentumokat helyi fájlokban, megosztott hálózati meghajtókon vagy az SQL Server által elérhető Azure Files-helyeken tárolja, tömeges importálással betöltheti A JSON-adatokat az SQL Serverbe.

  • Ha a vonallal tagolt JSON-fájlokat az Azure Blob Storage vagy a Hadoop fájlrendszer tárolja, a PolyBase használatával betöltheti a JSON-szöveget, elemezheti Transact-SQL kódban, és betöltheti a táblákba.

JSON-adatok importálása SQL Server-táblákba

Ha JSON-adatokat kell betöltenie egy külső szolgáltatásból az SQL Serverbe, az alkalmazásrétegben lévő adatok elemzése helyett importálhatja OPENJSON az adatokat az SQL Serverbe.

A támogatott platformokon használja a natív JSON adattípust az nvarchar(max) helyett a jobb teljesítmény és a hatékonyabb tárolás érdekében.

DECLARE @jsonVariable NVARCHAR(MAX);

SET @jsonVariable = N'[
  {
    "Order": {
      "Number":"SO43659",
      "Date":"2011-05-31T00:00:00"
    },
    "AccountNumber":"AW29825",
    "Item": {
      "Price":2024.9940,
      "Quantity":1
    }
  },
  {
    "Order": {
      "Number":"SO43661",
      "Date":"2011-06-01T00:00:00"
    },
    "AccountNumber":"AW73565",
    "Item": {
      "Price":2024.9940,
      "Quantity":3
    }
  }
]';

-- INSERT INTO <sampleTable>
SELECT SalesOrderJsonData.*
FROM OPENJSON(@jsonVariable, N'$') WITH (
    Number VARCHAR(200) N'$.Order.Number',
    Date DATETIME N'$.Order.Date',
    Customer VARCHAR(200) N'$.AccountNumber',
    Quantity INT N'$.Item.Quantity'
) AS SalesOrderJsonData;

Megadhatja a JSON-változó tartalmát egy külső REST szolgáltatással, elküldheti paraméterként egy ügyféloldali JavaScript-keretrendszerből, vagy betöltheti külső fájlokból. A JSON-szövegből származó eredményeket egyszerűen beszúrhatja, frissítheti vagy egyesítheti egy SQL Server-táblába.

JSON-adatok elemzése SQL-lekérdezésekkel

Ha jelentéskészítés céljából jSON-adatokat kell szűrnie vagy összesítenie, a OPENJSON JSON relációs formátumra alakítható át. Ezután szabványos Transact-SQL és beépített függvényekkel készítheti elő a jelentéseket.

SELECT Tab.Id,
    SalesOrderJsonData.Customer,
    SalesOrderJsonData.Date
FROM SalesOrderRecord AS Tab
CROSS APPLY OPENJSON(Tab.json, N'$.Orders.OrdersArray') WITH (
    Number VARCHAR(200) N'$.Order.Number',
    Date DATETIME N'$.Order.Date',
    Customer VARCHAR(200) N'$.AccountNumber',
    Quantity INT N'$.Item.Quantity'
) AS SalesOrderJsonData
WHERE JSON_VALUE(Tab.json, '$.Status') = N'Closed'
ORDER BY JSON_VALUE(Tab.json, '$.Group'),
    Tab.DateModified;

Ugyanabban a lekérdezésben használhatja a normál táblaoszlopokat és a JSON-szöveg értékeit is. A lekérdezés teljesítményének javítása érdekében indexeket JSON_VALUE(Tab.json, '$.Status') adhat hozzá a kifejezéshez. További információ: Index JSON-adatok.

JSON-ként formázott SQL Server-táblából származó adatok visszaadása

Ha olyan webszolgáltatással rendelkezik, amely adatokat vesz fel az adatbázisrétegből, és JSON formátumban adja vissza azokat, vagy ha olyan JavaScript-keretrendszerekkel vagy kódtárakkal rendelkezik, amelyek JSON-ként formázott adatokat fogadnak el, a JSON-kimenetet közvetlenül egy SQL-lekérdezésben formázhatja. Ahelyett, hogy kódot írnál vagy kódtárat használnál a táblázatos lekérdezési eredmények konvertálásához, majd az objektumok JSON-formátumba való szerializálásához, a JSON-formázást az SQL Serverre delegálhatja FOR JSON .

Előfordulhat például, hogy olyan JSON-kimenetet szeretne létrehozni, amely megfelel az OData-specifikációnak. A webszolgáltatás a következő formátumban vár egy kérést és választ:

  • Kérés: /Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName

  • Válasz: {"@odata.context": "https://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity", "ProductID": 1, "ProductName": "Chai"}

Ez az OData URL-cím az 1-et tartalmazó ID termék ProductID és ProductName oszlopainak kérését jelöli. A FOR JSON kimenetet a várt módon formázhatja az SQL Serverben.

SELECT 'https://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity' AS '@odata.context',
  ProductID,
  Name as ProductName
FROM Production.Product
WHERE ProductID = 1
FOR JSON AUTO;

A lekérdezés kimenete olyan JSON-szöveg, amely teljes mértékben megfelel az OData-specifikációnak. A formázást és a menekülést az SQL Server kezeli. Az SQL Server bármilyen formátumban formázhatja a lekérdezési eredményeket, például OData JSON vagy GeoJSON.

A meghajtó beépített JSON-támogatásának tesztelése az AdventureWorks mintaadatbázissal

Az AdventureWorks-mintaadatbázis lekéréséhez töltse le legalább az adatbázisfájlt és a mintákat és szkripteket a GitHubról.

Miután visszaállította a mintaadatbázist egy SQL Server-példányra, bontsa ki a mintafájlt, majd nyissa meg a JSON Sample Queries procedures views and indexes.sql fájlt a JSON mappából. Futtassa a fájlban található szkripteket néhány meglévő adat JSON-adatként való újraformálásához, a JSON-adatokon végzett minta-lekérdezések és jelentések teszteléséhez, a JSON-adatok indexeléséhez, valamint a JSON importálásához és exportálásához.

A következő műveleteket végezheti el a fájlban található szkriptekkel:

  • A meglévő séma denormalizálása JSON-adatok oszlopainak létrehozásához.

    • A JSON-oszlopokban tárolja a SalesReasons táblában az értékesítési rendeléssel kapcsolatos információkat tartalmazó SalesOrderDetails, SalesPerson, Customer, SalesOrder_json és más táblázatok adatait.

    • Tárolja a EmailAddresses és PersonPhone táblákban lévő információt JSON-objektumok tömbjeként a Person_json táblában.

  • JSON-adatokat lekérdező eljárások és nézetek létrehozása.

  • JSON-adatok indexelése. Indexek létrehozása JSON-tulajdonságokon és teljes szöveges indexeken.

  • JSON importálása és exportálása. Hozzon létre és futtasson olyan eljárásokat, amelyek JSON-eredményként exportálják a PersonSalesOrder táblák tartalmát, és JSON-bemenettel importálják és frissítik Person a SalesOrder táblákat.

  • Lekérdezési példák futtatása. Futtasson néhány lekérdezést, amelyek meghívják a 2. és 4. lépésben létrehozott tárolt eljárásokat és nézeteket.

  • Szkriptek törlése. Ne futtassa ezt a részt, ha meg szeretné tartani a 2. és 4. lépésben létrehozott tárolt eljárásokat és nézeteket.