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.