Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server 2016 (13.x) a novější verze
Azure SQL Database
azure SQL Managed Instance
databáze Azure Synapse Analytics
SQL v Microsoft Fabric
Tento článek obsahuje přehled formátu JSON textového formátu dat v SQL Serveru, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics a databázi SQL v Microsoft Fabric.
Poznámka:
- Podpora JSON vyžaduje úroveň kompatibility databáze 130 nebo vyšší.
Přehled
JSON je oblíbený textový formát dat, který slouží ke výměně dat v moderních webových a mobilních aplikacích. JSON se také používá k ukládání nestrukturovaných dat do souborů protokolů nebo databází NoSQL, jako je Microsoft Azure Cosmos DB. Mnoho webových služeb REST vrací výsledky, které jsou formátované jako text JSON nebo přijímají data formátovaná jako JSON. Například většina služeb Azure, jako je Azure Search, Azure Storage a Azure Cosmos DB, má koncové body REST, které vrací nebo využívají JSON. JSON je také hlavním formátem pro výměnu dat mezi webovými stránkami a webovými servery pomocí volání AJAX.
Funkce JSON, poprvé představené v SQL Serveru 2016 (13.x), umožňují kombinovat NoSQL a relační koncepty ve stejné databázi. Klasické relační sloupce můžete kombinovat se sloupci, které obsahují dokumenty formátované jako text JSON ve stejné tabulce, parsovat a importovat dokumenty JSON v relačních strukturách nebo formátovat relační data na text JSON.
Následuje příklad textu JSON:
[
{
"name": "John",
"skills": [ "SQL", "C#", "Azure" ]
},
{
"name": "Jane",
"surname": "Doe"
}
]
Pomocí předdefinovaných funkcí a operátorů SQL Serveru můžete s textem JSON provádět následující akce:
- Parsujte text JSON a načtěte nebo upravte hodnoty.
- Transformujte pole objektů JSON do formátu tabulky.
- Spusťte libovolný Transact-SQL dotaz na převedené objekty JSON.
- Naformátujte výsledky Transact-SQL dotazů ve formátu JSON.
Změny SQL Serveru 2025
SQL Server 2025 (17.x) Preview představuje následující vylepšení JSON, která jsou aktuálně ve verzi Preview:
-
Upravit metodu pro
json
typ - VYTVOŘENÍ INDEXU JSON
- Funkce JSON_CONTAINS
- Podpora zástupných znaků pole cest ANSI SQL
- Klauzule ANSI SQL WITH ARRAY WRAPPER ve funkci JSON_QUERY
Klíčové funkce JSON
V dalších částech se budeme zabývat klíčovými možnostmi, které SQL Server poskytuje s integrovanou podporou JSON.
Datový typ JSON
Nový datový typ JSON , který ukládá dokumenty JSON v nativním binárním formátu, který poskytuje následující výhody při ukládání dat JSON v varchar/nvarchar:
- Efektivnější čtení, protože dokument je již analyzován
- Efektivnější zápisy, protože dotaz může aktualizovat jednotlivé hodnoty bez přístupu k celému dokumentu
- Efektivnější úložiště optimalizované pro kompresi
- Žádná změna kompatibility s existujícím kódem
Poznámka:
- je obecně dostupná pro službu Azure SQL Database a spravovanou instanci Azure SQL nakonfigurovanou pomocí zásad aktualizace always-up-to-date.
- je ve verzi Preview pro SQL Server 2025 (17.x) Preview.
Použití stejných funkcí JSON popsaných v tomto článku zůstává nejúčinnějším způsobem dotazování datového typu JSON . Další informace o nativním datovém typu JSON najdete v tématu Datový typ JSON.
Extrahování hodnot z textu JSON a jejich použití v dotazech
Pokud máte text JSON uložený v databázových tabulkách, můžete číst nebo upravovat hodnoty v textu JSON pomocí následujících předdefinovaných funkcí:
- ISJSON (Transact-SQL) testuje, jestli řetězec obsahuje platný json.
- JSON_VALUE (Transact-SQL) extrahuje skalární hodnotu z řetězce JSON.
- JSON_QUERY (Transact-SQL) extrahuje objekt nebo pole z řetězce JSON.
- JSON_MODIFY (Transact-SQL) změní hodnotu v řetězci JSON.
Příklad
V následujícím příkladu dotaz používá relační data i data JSON (uložená ve sloupci s názvem jsonCol
) z tabulky s názvem 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');
Aplikace a nástroje nevidí žádný rozdíl mezi hodnotami odebranými ze sloupců skalární tabulky a hodnotami odebranými ze sloupců JSON. Hodnoty z textu JSON můžete použít v libovolné části dotazu Transact-SQL (včetně klauzulí WHERE, ORDER BY nebo GROUP BY, agregací oken atd.). Funkce JSON používají javascriptovou syntaxi pro odkazování na hodnoty uvnitř textu JSON.
Další informace najdete v tématu Ověřování, dotazování a změna dat JSON pomocí předdefinovaných funkcí (SQL Server),JSON_VALUE (Transact-SQL) a JSON_QUERY (Transact-SQL).
Změna hodnot JSON
Pokud je nutné upravit části textu JSON, můžete pomocí funkce JSON_MODIFY (Transact-SQL) aktualizovat hodnotu vlastnosti v řetězci JSON a vrátit aktualizovaný řetězec JSON. Následující příklad aktualizuje hodnotu vlastnosti v proměnné, která obsahuje JSON:
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;
Tady je soubor výsledků.
{"info":{"address":[{"town":"Belgrade"},{"town":"London"},{"town":"Madrid"}]}}
Převod kolekcí JSON na sadu řádků
Pro dotazování JSON na SQL Serveru nepotřebujete vlastní dotazovací jazyk. K dotazování dat JSON můžete použít standardní jazyk T-SQL. Pokud potřebujete vytvořit dotaz nebo sestavu dat JSON, můžete data JSON snadno převést na řádky a sloupce voláním OPENJSON
funkce sady řádků. Další informace najdete v tématu Parsování a transformace dat JSON pomocí OPENJSON.
Následující příklad volá OPENJSON
a transformuje pole objektů, které jsou uloženy v @json
proměnné na sadu řádků, které lze dotazovat pomocí standardního příkazu Transact-SQL 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'
);
Tady je soubor výsledků.
Průkaz totožnosti | křestní jméno | příjmení | věk | datum narození |
---|---|---|---|---|
2 | John | Novák | 25 | |
5 | Jana | Novák | 2005-11-04T12:00:00 |
OPENJSON
transformuje pole objektů JSON na tabulku, ve které je každý objekt reprezentován jako jeden řádek a páry klíč/hodnota jsou vráceny jako buňky. Výstup sleduje následující pravidla:
-
OPENJSON
převede hodnoty JSON na typy zadané v klauzuliWITH
. -
OPENJSON
dokáže zpracovat dvojice plochých klíč/hodnota i vnořené, hierarchicky uspořádané objekty. - Nemusíte vracet všechna pole obsažená v textu JSON.
- Pokud hodnoty JSON neexistují,
OPENJSON
vrátí hodnotyNULL
. - Volitelně můžete zadat cestu za specifikací typu, která odkazuje na vnořenou vlastnost nebo na vlastnost odkazuje jiným názvem.
- Volitelná
strict
předpona v cestě určuje, že hodnoty pro zadané vlastnosti musí existovat v textu JSON.
Další informace najdete v tématu Parsování a transformace dat JSON pomocí OPENJSON a OPENJSON (Transact-SQL).
Dokumenty JSON můžou obsahovat dílčí prvky a hierarchická data, která nelze přímo namapovat na standardní relační sloupce. V tomto případě můžete zploštět hierarchii JSON spojením nadřazené entity s dílčími poli.
V následujícím příkladu má druhý objekt v poli dílčí pole představující dovednosti osob. Každý dílčí objekt je možné analyzovat pomocí dalšího OPENJSON
volání funkce:
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) '$');
Pole skills
je vráceno jako původní fragment textu JSON v prvním OPENJSON
a předáno jiné funkci OPENJSON
pomocí operátoru APPLY
. Druhá OPENJSON
funkce parsuje pole JSON a vrací řetězcové hodnoty jako sadu řádků s jedním sloupcem, která se spojí s výsledkem prvního OPENJSON
.
Tady je soubor výsledků.
Průkaz totožnosti | křestní jméno | příjmení | věk | datum narození | dovednost |
---|---|---|---|---|---|
2 | John | Novák | 25 | ||
5 | Jana | Novák | 2005-11-04T12:00:00 | SQL | |
5 | Jana | Novák | 2005-11-04T12:00:00 | C# | |
5 | Jana | Novák | 2005-11-04T12:00:00 | Azurový |
OUTER APPLY OPENJSON
spojí entitu první úrovně s dílčím polem a vrátí zploštěnou sadu výsledků. Kvůli operaci JOIN se druhý řádek opakuje pro každou dovednost.
Převod dat SQL Serveru na JSON nebo export JSON
Poznámka:
Převod dat Azure Synapse Analytics na JSON nebo export JSON se nepodporuje.
Naformátujte data SQL Serveru nebo výsledky dotazů SQL jako JSON přidáním FOR JSON
klauzule do SELECT
příkazu. Slouží FOR JSON
k delegování formátování výstupu JSON z klientských aplikací na SQL Server. Další informace najdete v tématu Formátování výsledků dotazu jako JSON pomocí FOR JSON.
Následující příklad používá režim PATH s klauzulí FOR JSON
:
SELECT id,
firstName AS "info.name",
lastName AS "info.surname",
age,
dateOfBirth AS dob
FROM People
FOR JSON PATH;
Klauzule FOR JSON
formátuje výsledky SQL jako text JSON, který je možné poskytnout libovolné aplikaci, která rozumí formátu JSON. Možnost PATH používá k vnoření objektů ve výsledcích dotazu tečkované aliasy v klauzuli SELECT.
Tady je soubor výsledků.
[
{
"id": 2,
"info": {
"name": "John",
"surname": "Smith"
},
"age": 25
},
{
"id": 5,
"info": {
"name": "Jane",
"surname": "Smith"
},
"dob": "2005-11-04T12:00:00"
}
]
Další informace najdete v tématu Formátování výsledků dotazu ve formátu JSON s klauzulí FOR JSON a FOR (Transact-SQL).
Data JSON z agregací
Agregační funkce JSON umožňují stavět objekty NEBO pole JSON na základě agregace z dat SQL.
- JSON_OBJECTAGG vytvoří objekt JSON z agregace dat NEBO sloupců SQL.
- JSON_ARRAYAGG vytvoří pole JSON z agregace dat NEBO sloupců SQL.
Poznámka:
agregační funkce json JSON_OBJECTAGG
i JSON_ARRAYAGG
jsou aktuálně ve verzi Preview pro Azure SQL Database a azure SQL Managed Instance (nakonfigurované s Always-up-to-datem zásady aktualizace).
Případy použití dat JSON na SQL Serveru
Podpora JSON v SQL Serveru a Azure SQL Database umožňuje kombinovat relační koncepty a koncepty NoSQL. Relační data můžete snadno transformovat na částečně strukturovaná data a naopak. JSON ale není náhradou za existující relační modely. Tady je několik konkrétních případů použití, které využívají podporu JSON v SQL Serveru a ve službě SQL Database.
Zjednodušení složitých datových modelů
Zvažte denormalizaci datového modelu pomocí polí JSON místo více podřízených tabulek.
Maloobchodní prodej a data o elektronickém obchodování
Umožňuje ukládat informace o produktech s širokou škálou proměnných atributů v denormalizovaném modelu pro flexibilitu.
Zpracování protokolových a telemetrických dat
Načtěte, provádějte dotazy a analýzy logovacích dat uložených jako soubory ve formátu JSON s veškerými možnostmi jazyka Transact-SQL.
Ukládání částečně strukturovaných dat IoT
Pokud potřebujete analýzu dat z IoT v reálném čase, načtěte příchozí data přímo do databáze místo jejich uchovávání na úložišti.
Zjednodušení vývoje rozhraní REST API
Transformovat relační data z databáze snadno do formátu JSON používaného rozhraními REST API, která podporují váš web.
Kombinování relačních dat a dat JSON
SQL Server poskytuje hybridní model pro ukládání a zpracování relačních dat i dat JSON pomocí standardního jazyka Transact-SQL. Kolekce dokumentů JSON můžete uspořádat v tabulkách, vytvořit mezi nimi relace, kombinovat skalární sloupce silného typu uložené v tabulkách s flexibilními páry klíč/hodnota uložené ve sloupcích JSON a dotazovat se skalární i JSON hodnoty v jedné nebo více tabulkách pomocí úplného jazyka Transact-SQL.
Text JSON je uložený ve sloupcích VARCHAR
nebo NVARCHAR
a je indexován jako prostý text. Libovolná funkce nebo komponenta SQL Serveru, která podporuje text, podporuje JSON, takže neexistují téměř žádná omezení pro interakci mezi JSON a dalšími funkcemi SQL Serveru. Json můžete uložit v paměti nebo dočasných tabulkách, použít Row-Level predikáty zabezpečení u textu JSON atd.
Tady je několik případů použití, které ukazují, jak můžete použít integrovanou podporu JSON v SQL Serveru.
Ukládání a indexování dat JSON na SQL Serveru
JSON je textový formát, aby dokumenty JSON mohly být uloženy ve NVARCHAR
sloupcích ve službě SQL Database. Vzhledem k tomu, že NVARCHAR
se typ podporuje ve všech subsystémech SQL Serveru, můžete dokumenty JSON umístit do tabulek s clusterovanými indexy columnstore, tabulkami optimalizovanými pro paměť nebo externími soubory, které lze číst pomocí OPENROWSET nebo PolyBase.
Další informace o možnostech ukládání, indexování a optimalizace dat JSON na SQL Serveru najdete v následujících článcích:
- Ukládání dokumentů JSON v SQL Serveru nebo SQL Database
- Indexování dat JSON
- Optimalizace zpracování JSON pomocí OLTP v paměti
Načtení souborů JSON do SQL Serveru
Informace uložené v souborech můžete formátovat jako standardní JSON nebo JSON s oddělovači řádků. SQL Server může importovat obsah souborů JSON, analyzovat ho pomocí OPENJSON
funkcí nebo JSON_VALUE
funkcí a načíst ho do tabulek.
Pokud jsou vaše dokumenty JSON uložené v místních souborech, na sdílených síťových jednotkách nebo v umístěních Azure Files, ke kterým má SQL Server přístup, můžete data JSON načíst do SQL Serveru hromadným importem.
Pokud jsou soubory JSON s oddělovači řádků uložené ve službě Azure Blob Storage nebo v systému souborů Hadoop, můžete pomocí PolyBase načíst text JSON, parsovat ho v Transact-SQL kódu a načíst ho do tabulek.
Import dat JSON do tabulek SQL Serveru
Pokud je nutné načíst data JSON z externí služby do SQL Serveru, můžete je použít OPENJSON
k importu dat do SQL Serveru místo analýzy dat ve vrstvě aplikace.
V podporovaných platformách použijte nativní datový typ JSON místo nvarchar(max) pro lepší výkon a efektivnější úložiště.
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;
Obsah proměnné JSON můžete poskytnout externí službou REST, odeslat ho jako parametr z architektury JavaScriptu na straně klienta nebo ho načíst z externích souborů. Výsledky z textu JSON můžete snadno vložit, aktualizovat nebo sloučit do tabulky SQL Serveru.
Analýza dat JSON pomocí dotazů SQL
Pokud potřebujete filtrovat nebo agregovat data JSON pro účely vytváření sestav, můžete použít OPENJSON
k transformaci JSON na relační formát. K přípravě sestav můžete pak použít standardní Transact-SQL a integrované funkce.
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;
Ve stejném dotazu můžete použít standardní sloupce tabulky i hodnoty z textu JSON. Ke zlepšení výkonu dotazu můžete přidat indexy výrazu JSON_VALUE(Tab.json, '$.Status')
. Další informace najdete v tématu Indexování dat JSON.
Vrácení dat z tabulky SQL Serveru formátované jako JSON
Pokud máte webovou službu, která přebírá data z databázové vrstvy a vrací je ve formátu JSON, nebo pokud máte javascriptové architektury nebo knihovny, které přijímají data formátovaná jako JSON, můžete výstup JSON formátovat přímo v dotazu SQL. Místo psaní kódu nebo zahrnutí knihovny pro převod výsledků tabulkových dotazů a následné serializace objektů do formátu JSON můžete použít FOR JSON
k delegování formátování JSON na SQL Server.
Můžete například chtít vygenerovat výstup JSON, který je kompatibilní se specifikací OData. Webová služba očekává požadavek a odpověď v následujícím formátu:
Žádost:
/Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName
Odpověď:
{"@odata.context": "https://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity", "ProductID": 1, "ProductName": "Chai"}
Tato adresa URL OData představuje požadavek na sloupce ProductID a ProductName pro produkt s ID
1. Výstup můžete naformátovat FOR JSON
podle očekávání v SQL Serveru.
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;
Výstupem tohoto dotazu je text JSON, který je plně kompatibilní se specifikací OData. Sql Server zpracovává formátování a zapouzdření. SQL Server může také formátovat výsledky dotazu v libovolném formátu, jako je OData JSON nebo GeoJSON.
Vyzkoušejte vestavěnou podporu JSON s ukázkovou databází AdventureWorks.
Pokud chcete získat ukázkovou databázi AdventureWorks, stáhněte si aspoň soubor databáze a ukázky a skripty z GitHubu.
Po obnovení ukázkové databáze do instance SQL Serveru extrahujte soubor s ukázkami a poté otevřete soubor JSON Sample Queries procedures views and indexes.sql
ze složky JSON. Spuštěním skriptů v tomto souboru přeformátujte některá existující data jako data JSON, otestujte ukázkové dotazy a sestavy nad daty JSON, indexujte data JSON a importujte a exportujte JSON.
Tady je postup, který můžete dělat se skripty, které jsou součástí souboru:
Denormalizace existujícího schématu za účelem vytvoření sloupců dat JSON
Ukládejte informace z tabulek
SalesReasons
,SalesOrderDetails
,SalesPerson
,Customer
a dalších tabulek, které obsahují informace související s prodejní objednávkou, do sloupců JSON v tabulceSalesOrder_json
.Ukládat informace z
EmailAddresses
tabulek aPersonPhone
tabulek vPerson_json
tabulce jako pole objektů JSON.
Vytvořte procedury a zobrazení, které se dotazuje na data JSON.
Indexování dat JSON Vytvořte indexy pro vlastnosti JSON a fulltextové indexy.
Import a export JSON Vytvořte a spusťte procedury, které exportují obsah
Person
tabulek aSalesOrder
tabulek jako výsledky JSON, a importují a aktualizujíPerson
SalesOrder
tabulky pomocí vstupu JSON.Spusťte příklady dotazů. Spusťte některé dotazy, které volají uložené procedury a zobrazení, které jste vytvořili v krocích 2 a 4.
Vyčistěte skripty. Tuto část nespustíte, pokud chcete zachovat uložené procedury a zobrazení, které jste vytvořili v krocích 2 a 4.