Delen via


JSON-gegevens in SQL Server

van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-database in Microsoft Fabric

Dit artikel bevat een overzicht van de JSON-indeling voor tekstgegevens in SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics en SQL-database in Microsoft Fabric.

Opmerking

Overzicht

JSON is een populaire tekstuele gegevensindeling die wordt gebruikt voor het uitwisselen van gegevens in moderne web- en mobiele toepassingen. JSON wordt ook gebruikt voor het opslaan van ongestructureerde gegevens in logboekbestanden of NoSQL-databases zoals Microsoft Azure Cosmos DB. Veel REST-webservices retourneren resultaten die zijn opgemaakt als JSON-tekst of gegevens accepteren die zijn opgemaakt als JSON. De meeste Azure-services, zoals Azure Search, Azure Storage en Azure Cosmos DB, hebben bijvoorbeeld REST-eindpunten die JSON retourneren of gebruiken. JSON is ook de belangrijkste indeling voor het uitwisselen van gegevens tussen webpagina's en webservers met behulp van AJAX-aanroepen.

Met JSON-functies, die voor het eerst zijn geïntroduceerd in SQL Server 2016 (13.x), kunt u NoSQL- en relationele concepten in dezelfde database combineren. U kunt klassieke relationele kolommen combineren met kolommen die documenten bevatten die zijn opgemaakt als JSON-tekst in dezelfde tabel, JSON-documenten parseren en importeren in relationele structuren of relationele gegevens opmaken in JSON-tekst.

Hier volgt een voorbeeld van JSON-tekst:

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

Met behulp van ingebouwde SQL Server-functies en -operators kunt u de volgende dingen doen met JSON-tekst:

  • JSON-tekst parseren en waarden lezen of wijzigen.
  • Transformeer matrices van JSON-objecten in tabelindeling.
  • Voer een Transact-SQL query uit op de geconverteerde JSON-objecten.
  • Maak de resultaten van Transact-SQL query's op in JSON-indeling.

Diagram met het overzicht van ingebouwde JSON-ondersteuning.

SQL Server 2025-wijzigingen

SQL Server 2025 (17.x) Preview introduceert de volgende JSON-verbeteringen, allemaal in preview:

Belangrijke JSON-mogelijkheden

In de volgende secties worden de belangrijkste mogelijkheden besproken die SQL Server biedt met de ingebouwde JSON-ondersteuning.

JSON-gegevenstype

Het nieuwe json-gegevenstype waarin JSON-documenten worden opgeslagen in een systeemeigen binaire indeling die de volgende voordelen biedt bij het opslaan van JSON-gegevens in varchar/nvarchar:

  • Efficiëntere leesbewerkingen, omdat het document al wordt geparseerd
  • Efficiëntere schrijfbewerkingen, omdat de query afzonderlijke waarden kan bijwerken zonder het hele document te openen
  • Efficiëntere opslag, geoptimaliseerd voor compressie
  • Geen wijziging in compatibiliteit met bestaande code

Opmerking

Het JSON-gegevenstype:

  • is algemeen beschikbaar voor Azure SQL Database en Azure SQL Managed Instance die zijn geconfigureerd met het always-up-to-datum-updatebeleid.
  • is in preview voor SQL Server 2025 (17.x) Preview.

Het gebruik van dezelfde JSON-functies die in dit artikel worden beschreven, blijft de meest efficiënte manier om een query uit te voeren op het json-gegevenstype . Zie JSON-gegevenstype voor meer informatie over het systeemeigen JSON-gegevenstype.

Waarden extraheren uit JSON-tekst en deze gebruiken in query's

Als u JSON-tekst hebt die is opgeslagen in databasetabellen, kunt u waarden in de JSON-tekst lezen of wijzigen met behulp van de volgende ingebouwde functies:

Voorbeeld

In het volgende voorbeeld gebruikt de query zowel relationele als JSON-gegevens (opgeslagen in een kolom genaamd jsonCol) uit een tabel genaamd People:

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');

Toepassingen en hulpprogramma's zien geen verschil tussen de waarden die afkomstig zijn van scalaire tabelkolommen en de waarden uit JSON-kolommen. U kunt waarden uit JSON-tekst gebruiken in elk deel van een Transact-SQL-query (waaronder WHERE, ORDER BY of GROUP BY-componenten, vensteraggregaties, enzovoort). JSON-functies gebruiken javaScript-achtige syntaxis voor het verwijzen naar waarden in JSON-tekst.

Zie JSON-gegevens valideren, opvragen en wijzigen met ingebouwde functies (SQL Server), JSON_VALUE (Transact-SQL) en JSON_QUERY (Transact-SQL)voor meer informatie.

JSON-waarden wijzigen

Als u delen van JSON-tekst moet wijzigen, kunt u de functie JSON_MODIFY (Transact-SQL) gebruiken om de waarde van een eigenschap in een JSON-tekenreeks bij te werken en de bijgewerkte JSON-tekenreeks te retourneren. In het volgende voorbeeld wordt de waarde van een eigenschap in een variabele bijgewerkt die JSON bevat:

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;

Hier is het resultatenoverzicht.

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

JSON-verzamelingen converteren naar een rijset

U hebt geen aangepaste querytaal nodig om een query uit te voeren op JSON in SQL Server. Als u een query wilt uitvoeren op JSON-gegevens, kunt u standaard T-SQL gebruiken. Als u een query of rapport op JSON-gegevens moet maken, kunt u eenvoudig JSON-gegevens converteren naar rijen en kolommen door de OPENJSON functie rijenset aan te roepen. Zie JSON-gegevens parseren en transformeren met OPENJSON voor meer informatie.

In het volgende voorbeeld wordt OPENJSON aangeroepen en de array van objecten die in de @json variabele is opgeslagen, getransformeerd in een rijenset die kan worden opgevraagd met een standaard Transact-SQL-instructie SELECT.

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'
);

Hier is het resultatenoverzicht.

ID-kaart voornaam achternaam leeftijd geboortedatum
2 John Smit vijfentwintig
5 Jane Smit 2005-11-04T12:00:00

OPENJSON transformeert de matrix van JSON-objecten in een tabel waarin elk object wordt weergegeven als één rij en sleutel-waardeparen worden geretourneerd als cellen. De uitvoer volgt de volgende regels:

  • OPENJSON converteert JSON-waarden naar de typen die zijn opgegeven in de WITH component.
  • OPENJSON kan zowel platte sleutel-waardeparen als geneste, hiërarchisch ingedeelde objecten verwerken.
  • U hoeft niet alle velden in de JSON-tekst te retourneren.
  • Als JSON-waarden niet bestaan, retourneert OPENJSONNULL waarden.
  • U kunt desgewenst een pad opgeven na de typespecificatie om te verwijzen naar een geneste eigenschap of om te verwijzen naar een eigenschap met een andere naam.
  • Het optionele strict voorvoegsel in het pad geeft aan dat de waarden voor de opgegeven eigenschappen moeten bestaan in de JSON-tekst.

Zie JSON-gegevens parseren en transformeren met OPENJSON en OPENJSON (Transact-SQL)voor meer informatie.

JSON-documenten bevatten mogelijk subelementen en hiërarchische gegevens die niet rechtstreeks kunnen worden toegewezen aan de standaard relationele kolommen. In dit geval kunt u de JSON-hiërarchie plat maken door de bovenliggende entiteit samen te voegen met submatrices.

In het volgende voorbeeld heeft het tweede object in de matrix submatrix die persoonsvaardigheden vertegenwoordigt. Elk subobject kan worden geparseerd met behulp van een extra OPENJSON functie-aanroep:

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) '$');

De skills array wordt geretourneerd in het eerste OPENJSON als een JSON-tekstfragment en doorgegeven aan een andere OPENJSON functie met behulp van de APPLY operator. De tweede OPENJSON functie parseert de JSON-matrix en retourneert tekenreekswaarden als rijenset met één kolom die wordt samengevoegd met het resultaat van de eerste OPENJSON.

Hier is het resultatenoverzicht.

ID-kaart voornaam achternaam leeftijd geboortedatum vaardigheid
2 John Smit vijfentwintig
5 Jane Smit 2005-11-04T12:00:00 SQL
5 Jane Smit 2005-11-04T12:00:00 C#
5 Jane Smit 2005-11-04T12:00:00 Azuur

OUTER APPLY OPENJSON voegt een entiteit op het eerste niveau samen met een submatrix en retourneert een platte resultatenset. Vanwege JOIN wordt de tweede rij herhaald voor elke vaardigheid.

SQL Server-gegevens converteren naar JSON of JSON exporteren

Opmerking

Het converteren van Azure Synapse Analytics-gegevens naar JSON of het exporteren van JSON wordt niet ondersteund.

Maak SQL Server-gegevens of de resultaten van SQL-query's op als JSON door de FOR JSON component toe te voegen aan een SELECT instructie. Gebruik FOR JSON deze indeling om de opmaak van JSON-uitvoer van uw clienttoepassingen naar SQL Server te delegeren. Zie Queryresultaten opmaken als JSON met FOR JSON voor meer informatie.

In het volgende voorbeeld wordt de PATH-modus gebruikt met de FOR JSON component:

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

De FOR JSON component formatteert SQL-resultaten als JSON-tekst die kan worden verstrekt aan elke app die JSON begrijpt. De optie PATH maakt gebruik van door punt gescheiden aliassen in de SELECT-component om objecten in de queryresultaten te nesten.

Hier is het resultatenoverzicht.

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

Zie Queryresultaten opmaken als JSON met FOR JSON en FOR Clause (Transact-SQL) voor meer informatie.

JSON-gegevens uit aggregaties

Met statistische JSON-functies kunt u JSON-objecten of matrices bouwen op basis van een statistische functie van SQL-gegevens.

  • JSON_OBJECTAGG maakt een JSON-object op basis van een aggregatie van SQL-gegevens of -kolommen.
  • JSON_ARRAYAGG maakt een JSON-matrix op basis van een aggregatie van SQL-gegevens of -kolommen.

Opmerking

Zowel json statistische functies JSON_OBJECTAGG als JSON_ARRAYAGG zijn momenteel in preview voor Azure SQL Database en Azure SQL Managed Instance (geconfigureerd met de Always-up-to-date updatebeleid).

Gebruiksvoorbeelden voor JSON-gegevens in SQL Server

Met JSON-ondersteuning in SQL Server en Azure SQL Database kunt u relationele en NoSQL-concepten combineren. U kunt eenvoudig relationele naar semi-gestructureerde gegevens transformeren en vice versa. JSON is echter geen vervanging voor bestaande relationele modellen. Hier volgen enkele specifieke use cases die profiteren van de JSON-ondersteuning in SQL Server en in SQL Database.

Complexe gegevensmodellen vereenvoudigen

Overweeg om uw gegevensmodel te denormaliseren met JSON-velden in plaats van meerdere onderliggende tabellen.

Winkelretail- en e-commercegegevens

Sla informatie op over producten met een breed scala aan variabele kenmerken in een gedenormaliseerd model voor flexibiliteit.

Logboek- en telemetriegegevens verwerken

Laad, voer query's uit en analyseer logboekgegevens die zijn opgeslagen als JSON-bestanden met alle kracht van de Transact-SQL taal.

Semi-gestructureerde IoT-gegevens opslaan

Wanneer u realtime analyse van IoT-gegevens nodig hebt, laadt u de binnenkomende gegevens rechtstreeks in de database in plaats van deze in een opslaglocatie te faseren.

REST API-ontwikkeling vereenvoudigen

Transformeer relationele gegevens uit uw database eenvoudig in de JSON-indeling die wordt gebruikt door de REST API's die ondersteuning bieden voor uw website.

Relationele en JSON-gegevens combineren

SQL Server biedt een hybride model voor het opslaan en verwerken van zowel relationele als JSON-gegevens met behulp van de standaardtaal Transact-SQL. U kunt verzamelingen van uw JSON-documenten in tabellen organiseren, relaties tussen deze documenten tot stand brengen, sterk getypte scalaire kolommen combineren die zijn opgeslagen in tabellen met flexibele sleutel-waardeparen die zijn opgeslagen in JSON-kolommen en query's uitvoeren op zowel scalaire als JSON-waarden in een of meer tabellen met behulp van volledige Transact-SQL.

JSON-tekst wordt opgeslagen in VARCHAR of NVARCHAR kolommen en wordt geïndexeerd als tekst zonder opmaak. Elke SQL Server-functie of -onderdeel die ondersteuning biedt voor tekst ondersteunt JSON, dus er zijn bijna geen beperkingen voor interactie tussen JSON en andere SQL Server-functies. U kunt JSON opslaan in in-memory- of tijdelijke tabellen, Row-Level Beveiligingspredicaten toepassen op JSON-tekst, enzovoort.

Hier volgen enkele gebruiksvoorbeelden die laten zien hoe u de ingebouwde JSON-ondersteuning in SQL Server kunt gebruiken.

JSON-gegevens opslaan en indexeren in SQL Server

JSON is een tekstindeling, zodat de JSON-documenten kunnen worden opgeslagen in NVARCHAR kolommen in een SQL Database. Omdat NVARCHAR het type wordt ondersteund in alle SQL Server-subsystemen, kunt u JSON-documenten in tabellen plaatsen met geclusterde columnstore-indexen, tabellen die zijn geoptimaliseerd voor geheugen of externe bestanden die kunnen worden gelezen met behulp van OPENROWSET of PolyBase.

Zie de volgende artikelen voor meer informatie over uw opties voor het opslaan, indexeren en optimaliseren van JSON-gegevens in SQL Server:

JSON-bestanden laden in SQL Server

U kunt informatie opmaken die is opgeslagen in bestanden als standaard-JSON of met regels gescheiden JSON. SQL Server kan de inhoud van JSON-bestanden importeren, parseren met behulp van de OPENJSON of JSON_VALUE functies en deze laden in tabellen.

  • Als uw JSON-documenten zijn opgeslagen in lokale bestanden, op gedeelde netwerkstations of op Azure Files-locaties die toegankelijk zijn voor SQL Server, kunt u bulksgewijs importeren gebruiken om uw JSON-gegevens in SQL Server te laden.

  • Als uw met regels gescheiden JSON-bestanden worden opgeslagen in Azure Blob Storage of het Hadoop-bestandssysteem, kunt u PolyBase gebruiken om JSON-tekst te laden, deze te parseren in Transact-SQL code en in tabellen te laden.

JSON-gegevens importeren in SQL Server-tabellen

Als u JSON-gegevens van een externe service in SQL Server moet laden, kunt u met OPENJSON de gegevens importeren in SQL Server in plaats van de gegevens in de toepassingslaag te parseren.

Gebruik in ondersteunde platforms het systeemeigen json-gegevenstype in plaats van nvarchar(max) voor verbeterde prestaties en efficiëntere opslag.

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;

U kunt de inhoud van de JSON-variabele opgeven door een externe REST-service, deze verzenden als een parameter vanuit een JavaScript-framework aan de clientzijde of laden vanuit externe bestanden. U kunt eenvoudig resultaten van JSON-tekst invoegen, bijwerken of samenvoegen in een SQL Server-tabel.

JSON-gegevens analyseren met SQL-query's

Als u JSON-gegevens moet filteren of aggregeren voor rapportagedoeleinden, kunt OPENJSON u JSON transformeren naar relationele indeling. Vervolgens kunt u standaard Transact-SQL en ingebouwde functies gebruiken om de rapporten voor te bereiden.

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;

U kunt zowel standaardtabelkolommen als waarden uit JSON-tekst in dezelfde query gebruiken. U kunt indexen toevoegen aan de JSON_VALUE(Tab.json, '$.Status') expressie om de prestaties van de query te verbeteren. Zie JSON-gegevens indexeren voor meer informatie.

Gegevens retourneren uit een SQL Server-tabel die is opgemaakt als JSON

Als u een webservice hebt die gegevens uit de databaselaag haalt en deze retourneert in JSON-indeling, of als u JavaScript-frameworks of bibliotheken hebt die gegevens accepteren die zijn opgemaakt als JSON, kunt u JSON-uitvoer rechtstreeks in een SQL-query opmaken. In plaats van code te schrijven of een bibliotheek op te slaan om queryresultaten in tabelvorm te converteren en objecten vervolgens naar JSON-indeling te serialiseren, kunt FOR JSON u de JSON-opmaak delegeren naar SQL Server.

U kunt bijvoorbeeld JSON-uitvoer genereren die compatibel is met de OData-specificatie. De webservice verwacht een aanvraag en antwoord in de volgende indeling:

  • Aanvraag: /Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName

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

Deze OData-URL vertegenwoordigt een aanvraag voor de kolommen ProductID en ProductName voor het product met ID 1. U kunt de uitvoer opmaken met FOR JSON zoals verwacht in SQL Server.

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;

De uitvoer van deze query is JSON-tekst die volledig compatibel is met de OData-specificatie. Opmaak en escapen worden verwerkt door SQL Server. SQL Server kan ook queryresultaten opmaken in elke indeling, zoals OData JSON of GeoJSON.

Ingebouwde JSON-ondersteuning testen met de AdventureWorks-voorbeelddatabase

Als u de AdventureWorks-voorbeelddatabase wilt ophalen, downloadt u ten minste het databasebestand en het bestand met voorbeelden en scripts van GitHub.

Nadat u de voorbeelddatabase hebt hersteld naar een exemplaar van SQL Server, extraheert u het voorbeeldbestand en opent u het JSON Sample Queries procedures views and indexes.sql bestand vanuit de JSON-map. Voer de scripts in dit bestand uit om enkele bestaande gegevens opnieuw op te maken als JSON-gegevens, voorbeeldquery's en rapporten te testen over de JSON-gegevens, de JSON-gegevens te indexeren en JSON te importeren en exporteren.

Dit is wat u kunt doen met de scripts die zijn opgenomen in het bestand:

  • Denormaliseer het bestaande schema om kolommen met JSON-gegevens te maken.

    • Sla gegevens op uit SalesReasons, SalesOrderDetails, , SalesPersonen Customerandere tabellen die informatie bevatten met betrekking tot verkooporders in JSON-kolommen in de SalesOrder_json tabel.

    • Sla gegevens uit EmailAddresses en PersonPhone tabellen in de Person_json tabel op als matrices van JSON-objecten.

  • Procedures en weergaven maken voor het uitvoeren van query's op JSON-gegevens.

  • JSON-gegevens indexeren. Indexen maken voor JSON-eigenschappen en indexen in volledige tekst.

  • JSON importeren en exporteren. Maak en voer procedures uit waarmee de inhoud van de Person en de SalesOrder tabellen als JSON-resultaten worden geëxporteerd, en importeer en werk de PersonSalesOrder tabellen bij met behulp van JSON-invoer.

  • Voorbeelden van query's uitvoeren. Voer enkele query's uit die de opgeslagen procedures en weergaven aanroepen die u in stap 2 en 4 hebt gemaakt.

  • Scripts opschonen. Voer dit onderdeel niet uit als u de opgeslagen procedures en weergaven wilt behouden die u in stap 2 en 4 hebt gemaakt.