Når du bruger JSON med SQL Server, kan du bruge JSON_QUERY()
funktion til at udtrække et objekt eller et array fra en JSON-streng.
For at bruge denne funktion skal du angive JSON-udtrykket som et argument. Du kan også angive et andet (valgfrit) argument for at angive objektet eller arrayet, der skal udtrækkes.
Syntaks
Syntaksen ser sådan ud:
JSON_QUERY ( expression [ , path ] )
Hvor expression
er JSON-strengudtrykket og path
er det objekt eller det array, du vil udtrække fra det udtryk. path
argument er valgfrit (hvis du ikke angiver det, returneres hele JSON-dokumentet).
Stiargumentet (hvis det er angivet) kan inkludere en valgfri stitilstand komponent. Denne valgfri stitilstand kan være en værdi af enten lax
eller strict
. Denne værdi bestemmer, hvad der sker i tilfælde af, at den angivne sti er ugyldig. Stitilstanden (hvis den findes) kommer før dollartegnet.
Eksempel 1 – Grundlæggende brug
Her er et eksempel til at demonstrere grundlæggende brug af JSON_QUERY()
funktion.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
Resultat:
+----------+ | Result | |----------| | { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
I dette eksempel erklærer og indstiller jeg først en variabel kaldet @data
. Jeg tildeler derefter en matrix til denne variabel. Når jeg har gjort dette, kører jeg en forespørgsel mod det array.
I dette tilfælde bruger jeg Cities[0]
for at referere til det første element i arrayet (JSON-arrays bruger nul-baseret nummerering).
Jeg kunne få adgang til det andet element ved at bruge Cities[1]
. Sådan:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
Resultat:
+----------+ | Result | |----------| | { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } | +----------+
Eksempel 2 – Returner hele JSON-udtrykket
Det andet argument er valgfrit, så hvis du udelader det, returneres hele JSON-dokumentet. Her er, hvad der sker, når vi gør det ved at bruge de samme data fra de tidligere eksempler:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data) AS 'Result';
Resultat:
+----------+ | Result | |----------| | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +----------+
Eksempel 3 – Et databaseeksempel
Hvis vi skulle lægge data fra det forrige eksempel ind i en database, kunne vi omskrive forespørgslen som følger:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
Resultat:
+----------+ | City 1 | |----------| | { "ID": 1, "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
Dette forudsætter, at JSON-dokumentet er gemt i en kolonne kaldet Document
, som er i en tabel kaldet Json_Documents
.
Eksempel 4 – Skalære værdier
JSON_QUERY()
Funktionen er ikke designet til at returnere skalære værdier. Hvis du vil returnere en skalarværdi, skal du bruge JSON_VALUE()
funktion i stedet for.
Der er dog intet, der forhindrer dig i at kombinere begge funktioner i en forespørgsel for at returnere data på forskellige niveauer af granularitet.
Her er et eksempel:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Resultat:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
I dette eksempel brugte jeg JSON_VALUE()
til at udtrække forskellige skalarværdier, men jeg brugte også JSON_QUERY()
for at returnere en hel matrix (som JSON_VALUE()
kan ikke gøre).
Eksempel 5 – Stitilstand
Som nævnt har du også mulighed for at angive stitilstanden. Dette kan enten være lax
eller strict
.
Værdien af stitilstanden bestemmer, hvad der sker, når stiudtrykket indeholder en fejl. Specifikt:
- I slappe tilstand, returnerer funktionen tomme værdier, hvis stiudtrykket indeholder en fejl. For eksempel, hvis du anmoder om værdien $.name , og JSON-teksten indeholder ikke et navn tast, returnerer funktionen null, men rejser ikke en fejl.
-
I streng tilstand, rejser funktionen en fejl, hvis stiudtrykket indeholder en fejl.
Standardværdien er lax
.
Her er et eksempel for at demonstrere forskellen mellem disse to tilstande.
Fejl i slap tilstand
Her er, hvad der sker, når stiudtrykket indeholder en fejl, mens det er i slap tilstand.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
I dette eksempel forsøger vi at returnere en skalarværdi, men JSON_QUERY()
laver ikke skalære værdier. Som nævnt returnerer den kun objekter og arrays. I dette tilfælde får vi en nulværdi (fordi vi bruger lax mode).
Fejl i streng tilstand
Her er, hvad der sker, når vi kører den samme kode i streng tilstand.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
Resultat:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
Som forventet resulterer streng tilstand i en fejlmeddelelse, der forklarer fejlen.