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.