Zpracování XML a JSON dat na MS SQL Serveru
Obsah Typy úloh Kdo je to JSON a XML Kdy to celé začalo Data z SQL do FOR XML/FOR JSON Data z XML/JSON na SQL Server Rozdíly XML INDEX/(neexistující) JSON INDEX Zajištění validity
Typy úloh, scénáře Data příliš komplikovaná pro relační model CV Parametry mnoha druhů výrobků Výměna dat SOAP/REST web services Souborový formát SQL XML/JSON XML/JSON SQL XML/JSON jiné XML/JSON
Kdo jsou JSON a XML? Snadno čitelné textové popisy dat (stavu objektů) Obojí je čistý text V XML lze nastavit kódování, JSON je vždy UTF-8 Obojí je platformě nezávislé Velká škála procesorů Nevýhoda JSON: XML silněji popisuje metadata Namespaces, elementy a atributy dávají hodnotám význam Výhoda JSON: XML silněji popisuje metadata Cca 40 % obsahu XML hodnoty jsou metadata Na SQL Serveru nemá JSON zdaleka takovou podporu Datový typ, schémata
Trochu více o JSON JavaScript Object Notation Objekt {“klic1”: cislo, “klic2”: “retezec”, “klic3”: true} Objekt v objektu: {“subobjekt”: {“klic”: cislo}, “skalar”: true} Pole: [{“klic”: “hodnota”}, {“klic”: hodnota}] Výchozí kódování UTF-8 Znaky v UTF-16 jako entity \u0000 Neměnné (na rozdíl od XML) Na SQL Serveru uvažujeme jako nvarchar
Časté chyby v JSON zápisu {klic: “hodnota”} – názvy klíčů MUSÍ být v uvozovkách {‘klic’: ‘hodnota’} – nepoužívají se apostrofy {“ciselny_klic”:.5} – číslo musí začínat číslicí (0.5) {“klic”: “hodnota”, } – pozor na čárku za posledním klíčem
Kdy to začalo na SQL Serveru MS SQL 2000 SELECT… FOR XML Režimy RAW/AUTO Slabé, první pokus MS SQL 2008 Zavádí datový typ XML s nativními metodami Zavádí objekt XML SCHEMA COLLECTION (xsd) Rozšiřuje FOR XML o režimy PATH a EXPLICIT MS SQL 2016 SELECT … FOR JSON (AUTO/PATH) SQL metody pro zpracování JSON hodnoty Vyžaduje cmtp level 130
Rychlé srovnání VlastnostJSONXML Režimy získání z relačních datSELECT FOR JSON AUTO/PATHSELECT FOR XML RAW/AUTO/PATH/EXPLICIT Vlastní datový typNeexistuje (substitut: nvarchar + fce ISJSON) Xml (použitelný bez omezení) Zpracování do relačních datOPENJSONOPENXML (DOM) Xml metody (SAX) Práce s uloženou hodnotouFce JSON_VALUE Fce JSON_QUERY Fce JSON_MODIFY Funkce na instanci xml hodnoty.value().exist().nodes().query() Pozn. CROSS APPLY IndexacePřes computed columnNativní XML index
DOM realizace na SQL Serveru I Získání XML hodnoty xml = … (XML třeba ze souboru) Načtení hodnoty do paměti EXEC Zpracování Úklid paměti EXEC
DOM realizace na SQL Serveru II SELECT * FROM ‘base_path’, 0) WITH ( Název_sloupce datový_typ‘volitelně cesta k hodnotě’, … ) Pokud není uveden popis struktury, vrací samotnou strukturu, a ještě pomalu!
SAX na SQL Serveru I Metody přímo na datovém typu Výčet běžných metod: value(‘xPath’, ‘return sql server type’): vrací hodnotu uzlu exist(‘xPath’): vrací 0 nebo 1 podle toho, zda uzel (resp. hodnota uzlu) existuje nodes(‘xPath’): vytváří subset XML (klauzule FROM) query(‘xQuery’): může vytvořit nové XML („transformaci“) modify(‘xQuery’): může modifikovat obsah
SAX na SQL Serveru II Výhody Zpracování více XML hodnot najednou (celý sloupec tabulky) Nepotřebuje přípravu a úklid Malá paměťová náročnost Nevýhody Poněkud méně přehledný zápis Zpomaluje Léčba XML indexy Použití XML schémat v deklaraci XML sloupců
JSON „DOM“ na SQL Serveru Rowsetová funkce OPENJSON() Bez WITH vždy vrací výsledek s těmito položkami Key: název klíče (i když je to pole objektů, pak string) Value: hodnota klíče (i když je to celý objekt, pak string) Type: nešikovná enumerace 0: null 1: string 2: int 3: bool 4: array (string JSON format) 5: object (string JSON format) WITH: formátuje „pěknou“ výsledkovou sadu AS JSON, když některé sloupce mají zůstat validní JSON
JSON výrazy Používány ve funkcích $ kontextový prvek $.klic nebo $.”viceslovny klic” [] indexer pole Indexováno od 0 Lze použít jako atribut_typu_pole[0]: celý objekt Nebo jako atribut_typu_pole[0].klic: jednotlivá hodnota Přísnost výrazů lax: neexistující cesta vrátí NULL (default) strict: neexistující cesta vrátí error Řešení duplicit atributů: JSON výraz vrátí první výskyt klíče
JSON funkce do klauzule SELECT (JSON „SAX“) Jsou schopny zpracovat JSON hodnoty z celého sloupce v tabulce JSON_VALUE() Z cesty vybere hodnotu Obdoba xml.value() JSON_QUERY() Z cesty extrahuje validní „subJSON“ (správné escapování) Obdoba xml.query() JSON_MODIFY() Přímý update do JSON hodnoty Teoreticky lze nahradit řetězcovou funkcí REPLACE Chatrná přesnost
Příklady, ukázky Deklarace vhodného datového typu XML JSON CHECK Získání dat ve formátu JSON/XML SELECT FOR Načtení JSON/XML dat ze souboru Zpracování JSON/XML dat v tabulce Indexace