Při použití JSON se serverem SQL Server můžete použít JSON_QUERY()
funkce pro extrahování objektu nebo pole z řetězce JSON.
Chcete-li tuto funkci použít, zadejte jako argument výraz JSON. Můžete také zadat druhý (volitelný) argument pro určení objektu nebo pole, které se má extrahovat.
Syntaxe
Syntaxe vypadá takto:
JSON_QUERY ( výraz [ , cesta ] )
Kde expression
je řetězcový výraz JSON a path
je objekt nebo pole, které chcete z tohoto výrazu extrahovat. path
argument je volitelný (pokud jej nezadáte, vrátí se celý dokument JSON).
Argument cesty (pokud je zadán) může obsahovat volitelný režim cesty součástka. Tento volitelný režim cesty může mít hodnotu buď lax
nebo strict
. Tato hodnota určuje, co se stane v případě, že zadaná cesta je neplatná. Režim cesty (pokud je dodán) je před znakem dolaru.
Příklad 1 – Základní použití
Zde je příklad demonstrující základní použití JSON_QUERY()
funkce.
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[0 ]') AS 'Výsledek';
Výsledek:
+-----------+| Výsledek ||-----------|| { "Jméno":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Populace":1780000 } |+----------+
V tomto příkladu nejprve deklaruji a nastavím proměnnou s názvem @data
. Této proměnné pak přiřadím pole. Jakmile to udělám, spustím dotaz na toto pole.
V tomto případě používám Cities[0]
odkazovat na první položku v poli (pole JSON používají číslování založené na nule).
K druhé položce jsem mohl přistupovat pomocí Cities[1]
. Takhle:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Populace":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[1 ]') AS 'Výsledek';
Výsledek:
+-----------+| Výsledek ||-----------|| { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } |+----------+
Příklad 2 – Vrácení celého výrazu JSON
Druhý argument je volitelný, takže pokud jej vynecháte, vrátí se celý dokument JSON. Co se stane, když to uděláme pomocí stejných dat z předchozích příkladů:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Název":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data) AS 'Result';Výsledek:
+-----------+| Výsledek ||-----------|| { "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 }, { "Name":"Qandahar", "CountryCode" :"AFG", "District":"Qandahar", "Populace":237500 } ]} |+----------+Příklad 3 – Příklad databáze
Pokud bychom vložili data z předchozího příkladu do databáze, mohli bychom dotaz přepsat takto:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1'FROM Json_DocumentsVýsledek:
+-----------+| Město 1 ||-----------|| { "ID":1, "Jméno":"Kábul", "CountryCode":"AFG", "Okres":"Kabol", "Populace":1780000 } |+-----------+To předpokládá, že dokument JSON je uložen ve sloupci s názvem
Document
, která je v tabulce nazvanéJson_Documents
.Příklad 4 – Skalární hodnoty
JSON_QUERY()
funkce není navržena tak, aby vracela skalární hodnoty. Pokud chcete vrátit skalární hodnotu, použijteJSON_VALUE()
místo toho.Nic vám však nebrání zkombinovat obě funkce v rámci dotazu a vrátit data na různých úrovních podrobnosti.
Zde je příklad:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Podezřelý":{ "Jméno":"Homer Simpson", "Hobby":["Jídlo", "Spánek", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies [2]') JAKO 'Poslední koníček';Výsledek:
+---------------+------------------------------ ----------+--------------+| Jméno | Koníčky | Poslední koníček ||---------------+------------------------------ ----------+--------------|| Homer Simpson | ["Jíst", "Spát", "Base Jumping"] | Base Jumping |+---------------+------------------------------ ----------+--------------+V tomto příkladu jsem použil
JSON_VALUE()
k extrakci různých skalárních hodnot, ale také jsem použilJSON_QUERY()
vrátit celé pole (cožJSON_VALUE()
nemůžu).Příklad 5 – Režim cesty
Jak již bylo zmíněno, máte také možnost určit režim cesty. Může to být buď
lax
nebostrict
.Hodnota režimu cesty určuje, co se stane, když výraz cesty obsahuje chybu. Konkrétně:
- V laxním režimu, funkce vrací prázdné hodnoty, pokud výraz cesty obsahuje chybu. Pokud například požadujete hodnotu $.name a text JSON neobsahuje název funkce vrátí hodnotu null, ale nevyvolá chybu.
-
V přísném režimu, funkce vyvolá chybu, pokud výraz cesty obsahuje chybu.
Výchozí hodnota je lax
.
Zde je příklad, který demonstruje rozdíl mezi těmito dvěma režimy.
Chyba v laxním režimu
Zde je návod, co se stane, když výraz cesty obsahuje chybu v laxním režimu.
SELECT JSON_QUERY('{"Name":"Bruce"}', 'laxní $.Name') AS 'Result';
Výsledek:
+-----------+| Výsledek ||-----------|| NULL |+----------+
V tomto příkladu se snažíme vrátit skalární hodnotu, ale JSON_QUERY()
nedělá skalární hodnoty. Jak bylo zmíněno, vrací pouze objekty a pole. V tomto případě dostaneme hodnotu null (protože používáme laxní režim).
Chyba v přísném režimu
Zde je to, co se stane, když spustíme stejný kód v přísném režimu.
SELECT JSON_QUERY('{"Name":"Bruce"}', 'strict $.Name') AS 'Result';
Výsledek:
Zpráva 13624, úroveň 16, stav 2, řádek 1 V zadané cestě JSON nelze nalézt objekt nebo pole.
Jak se očekávalo, přísný režim má za následek chybovou zprávu vysvětlující chybu.