Delen via


JSON-gegevenstype

Van toepassing op: SQL Server 2025 (17.x) Preview AzureSQL Database Azure SQL Managed InstanceSQL-databasein Microsoft Fabric Preview

Het json-gegevenstype slaat JSON-documenten op in een systeemeigen binaire indeling.

Het json-type biedt een hoogwaardige opslag van JSON-documenten die zijn geoptimaliseerd voor eenvoudige query's en manipulatie en biedt de volgende voordelen ten opzichte van het opslaan van JSON-gegevens als varchar of 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

Het json-type slaat gegevens intern op met behulp van UTF-8-codering, Latin1_General_100_BIN2_UTF8. Dit gedrag komt overeen met de JSON-specificatie.

Zie JSON-gegevens in SQL Servervoor meer informatie over het uitvoeren van query's op JSON-gegevens.

Voorbeeldsyntaxis

De gebruiksyntaxis voor het json-type is vergelijkbaar met alle andere SQL Server-gegevenstypen in een tabel.

column_name JSON [ NOT NULL | NULL ] [CHECK ( constraint_expression ) ] [ DEFAULT ( default_expression ) ]

Het json-gegevenstype kan worden gebruikt in de kolomdefinitie in een CREATE TABLE instructie. Voorbeeld:

CREATE TABLE Orders
(
    order_id INT,
    order_details JSON NOT NULL
);

Beperkingen kunnen worden opgegeven als onderdeel van de kolomdefinitie. Voorbeeld:

CREATE TABLE Orders
(
    order_id INT,
    order_details JSON NOT NULL
        CHECK (JSON_PATH_EXISTS(order_details, '$.basket') = 1)
);

Beschikbaarheid van functies

JSON-functieondersteuning is voor het eerst geïntroduceerd in SQL Server 2016 (13.x). Het systeemeigen json-type is geïntroduceerd in Azure SQL Database en Azure SQL Managed Instance en is ook beschikbaar in SQL Server 2025 (17.x) Preview.

Het json-gegevenstype is beschikbaar onder alle databasecompatibiliteitsniveaus.

Note

Het JSON-gegevenstype:

  • is algemeen beschikbaar voor Azure SQL Database en Azure SQL Managed Instance met het beleid voor SQL Server 2025 of Always-up-to-dateupdate.
  • is in preview voor SQL Server 2025 (17.x) Preview en SQL-database in Fabric.

De wijzigingsmethode

Note

De modify methode is momenteel beschikbaar als preview-versie en is alleen beschikbaar in SQL Server 2025 (17.x) Preview.

Het json-gegevenstype ondersteunt de modify methode. Hiermee modify kunt u JSON-documenten wijzigen die zijn opgeslagen in een kolom. De modify methode heeft optimalisaties om waar mogelijk in-place wijzigingen in de gegevens uit te voeren en is de voorkeurswijze om een JSON-document in een json-kolom te wijzigen.

Als voor JSON-tekenreeksen de nieuwe waarde kleiner is dan of gelijk is aan de bestaande waarde, is in-place aanpassing mogelijk.

Als voor JSON-getallen de nieuwe waarde van hetzelfde type is of binnen het bereik van de bestaande waarde, is in-place wijziging mogelijk.

DROP TABLE IF EXISTS JsonTable;

CREATE TABLE JsonTable
(
    id INT PRIMARY KEY,
    d JSON
);

INSERT INTO JsonTable (id, d)
VALUES (1, '{"a":1, "b":"abc", "c":true}');

UPDATE JsonTable
SET d.modify('$.a', 14859)
WHERE id = 1;

UPDATE JsonTable
SET d.modify('$.b', 'def')
WHERE id = 1;

Functieondersteuning

Alle JSON-functies ondersteunen het JSON-gegevenstype zonder dat er codewijzigingen of gebruiksverschillen nodig zijn.

  • OPENJSON biedt momenteel geen ondersteuning voor het json-gegevenstype op sommige platforms. Zie Beperkingen voor meer informatie.

Zie JSON-functies voor een volledige lijst met JSON-functies.

Indexes

Er zijn geen speciale indextypen voor JSON-gegevens.

Het json-type kan niet worden gebruikt als sleutelkolom in een CREATE INDEX instructie. Een json-kolom kan echter worden opgegeven als een opgenomen kolom in een indexdefinitie. Daarnaast kan een json-kolom worden weergegeven in de WHERE component van een gefilterde index.

Conversion

Expliciete conversie met CAST of CONVERT van het json-type kan worden uitgevoerd voor char-, nchar-, varchar- en nvarchar-typen . Alle impliciete conversies zijn niet toegestaan, vergelijkbaar met het gedrag van XML. Op dezelfde manier kunnen alleen tekens, nchar, varchar en nvarchar expliciet worden geconverteerd naar het json-gegevenstype .

Het json-gegevenstype kan niet worden gebruikt met het sql_variant type of toegewezen aan een sql_variant variabele of kolom. Deze beperking is vergelijkbaar met varchar(max), varbinary(max), nvarchar(max), xml en CLR-gegevenstypen.

U kunt bestaande kolommen zoals varchar(max) converteren naar json met behulp van ALTER TABLE. Net als bij het xml-gegevenstype kunt u een json-kolom niet converteren naar een van de tekenreeks- of binaire typen met behulp van ALTER TABLE.

Zie Conversie van gegevenstypen (Database Engine) voor meer informatie.

Compatibility

Het json-gegevenstype kan worden gebruikt als parameter of retourtype in een door de gebruiker gedefinieerde functie of de parameter van een opgeslagen procedure. Het json-type is compatibel met triggers en weergaven.

Momenteel bevat de systeemeigen indeling van het bcp-hulpprogramma het json-document als varchar of nvarchar. U moet een indelingsbestand opgeven om een json-kolom aan te wijzen.

Het maken van het aliastype dat wordt gebruikt CREATE TYPE voor het json-gegevenstype is niet toegestaan. Dit gedrag is hetzelfde als het xml-gegevenstype .

Als SELECT ... INTO u het json-gegevenstype gebruikt, wordt er een tabel gemaakt met het json-type .

Limitations

Het gedrag van het retourneren van CAST ( ... AS JSON) een JSON-gegevenstype , maar de sp_describe_first_result_set opgeslagen procedure retourneert het JSON-gegevenstype niet correct. Daarom zien veel clients en stuurprogramma's voor gegevenstoegang een varchar - of nvarchar-gegevenstype .

  • Momenteel ziet TDS >= 7,4 (met UTF-8) varchar(max) met Latin_General_100_bin2_utf8.
  • Momenteel ziet TDS < 7.4 nvarchar(max) met databasesortering.

Op dit moment accepteert de OPENJSON() functie het json-gegevenstype op sommige platforms niet. Momenteel is het een impliciete conversie. Converteer expliciet eerst naar nvarchar(max).