Wenn Sie JSON mit SQL Server verwenden, können Sie JSON_QUERY() verwenden Funktion, um ein Objekt oder ein Array aus einer JSON-Zeichenfolge zu extrahieren.
Um diese Funktion zu verwenden, geben Sie den JSON-Ausdruck als Argument an. Sie können auch ein zweites (optionales) Argument angeben, um das zu extrahierende Objekt oder Array anzugeben.
Syntax
Die Syntax sieht so aus:
JSON_QUERY ( expression [ , path ] )
Wobei expression ist der JSON-String-Ausdruck und path ist das Objekt oder Array, das Sie aus diesem Ausdruck extrahieren möchten. Der path Das Argument ist optional (wenn Sie es nicht angeben, wird das gesamte JSON-Dokument zurückgegeben).
Das Pfadargument (falls angegeben) kann einen optionalen Pfadmodus enthalten Komponente. Dieser optionale Pfadmodus kann ein Wert von entweder lax sein oder strict . Dieser Wert bestimmt, was passiert, wenn der angegebene Pfad ungültig ist. Der Pfadmodus (falls angegeben) steht vor dem Dollarzeichen.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel, um die grundlegende Verwendung von JSON_QUERY() zu demonstrieren 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';
Ergebnis:
+----------+
| Result |
|----------|
| {
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
} |
+----------+
In diesem Beispiel deklariere und setze ich zuerst eine Variable namens @data . Dieser Variable weise ich dann ein Array zu. Sobald ich dies getan habe, führe ich eine Abfrage für dieses Array aus.
In diesem Fall verwende ich Cities[0] um auf das erste Element im Array zu verweisen (JSON-Arrays verwenden eine nullbasierte Nummerierung).
Auf das zweite Element konnte ich mit Cities[1] zugreifen . So:
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';
Ergebnis:
+----------+
| Result |
|----------|
| {
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
} |
+----------+
Beispiel 2 – Den gesamten JSON-Ausdruck zurückgeben
Das zweite Argument ist optional. Wenn Sie es also weglassen, wird das gesamte JSON-Dokument zurückgegeben. Folgendes passiert, wenn wir die gleichen Daten aus den vorherigen Beispielen verwenden:
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';
Ergebnis:
+----------+
| Result |
|----------|
| {
"Cities": [
{
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
} |
+----------+
Beispiel 3 – Ein Datenbankbeispiel
Wenn wir die Daten aus dem vorherigen Beispiel in eine Datenbank einfügen würden, könnten wir die Abfrage wie folgt umschreiben:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
Ergebnis:
+----------+
| City 1 |
|----------|
| {
"ID": 1,
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
} |
+----------+
Dies setzt voraus, dass das JSON-Dokument in einer Spalte namens Document gespeichert ist , die sich in einer Tabelle namens Json_Documents befindet .
Beispiel 4 – Skalare Werte
Der JSON_QUERY() Die Funktion ist nicht darauf ausgelegt, skalare Werte zurückzugeben. Wenn Sie einen Skalarwert zurückgeben möchten, verwenden Sie JSON_VALUE() stattdessen funktionieren.
Nichts hindert Sie jedoch daran, beide Funktionen in einer Abfrage zu kombinieren, um Daten auf verschiedenen Granularitätsebenen zurückzugeben.
Hier ist ein Beispiel:
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';
Ergebnis:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
In diesem Beispiel habe ich JSON_VALUE() verwendet um verschiedene skalare Werte zu extrahieren, aber ich habe auch JSON_QUERY() verwendet um ein ganzes Array zurückzugeben (was JSON_VALUE() kann nicht).
Beispiel 5 – Pfadmodus
Wie erwähnt, haben Sie auch die Möglichkeit, den Pfadmodus festzulegen. Dies kann entweder lax sein oder strict .
Der Wert des Pfadmodus bestimmt, was passiert, wenn der Pfadausdruck einen Fehler enthält. Konkret:
- In locker Modus gibt die Funktion leere Werte zurück, wenn der Pfadausdruck einen Fehler enthält. Wenn Sie beispielsweise den Wert $.name anfordern , und der JSON-Text enthält keinen Namen -Taste, gibt die Funktion null zurück, löst aber keinen Fehler aus.
-
In streng Modus, löst die Funktion einen Fehler aus, wenn der Pfadausdruck einen Fehler enthält.
Der Standardwert ist lax .
Hier ist ein Beispiel, um den Unterschied zwischen diesen beiden Modi zu demonstrieren.
Fehler im Lax-Modus
Folgendes passiert, wenn der Pfadausdruck im Lax-Modus einen Fehler enthält.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
Ergebnis:
+----------+ | Result | |----------| | NULL | +----------+
In diesem Beispiel versuchen wir, einen Skalarwert zurückzugeben, aber JSON_QUERY() macht keine skalaren Werte. Wie bereits erwähnt, gibt es nur Objekte und Arrays zurück. In diesem Fall erhalten wir einen Nullwert (weil wir den Lax-Modus verwenden).
Fehler im strikten Modus
Folgendes passiert, wenn wir denselben Code im strikten Modus ausführen.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
Ergebnis:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
Wie erwartet führt der strikte Modus zu einer Fehlermeldung, die den Fehler erklärt.