Sdílet prostřednictvím


Data JSON na SQL Serveru

platí pro: SQL Server 2016 (13.x) a novější verze Azure SQL Databaseazure SQL Managed Instancedatabáze Azure Synapse AnalyticsSQL 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:

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.

Diagram znázorňující přehled integrované podpory 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:

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:

Datový typ JSON:

  • 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í:

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 klauzuli WITH .
  • 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í hodnoty NULL .
  • 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:

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 tabulce SalesOrder_json.

    • Ukládat informace z EmailAddresses tabulek a PersonPhone tabulek v Person_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 a SalesOrder tabulek jako výsledky JSON, a importují a aktualizují PersonSalesOrder 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.