JSON_QUERY (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics

Extrahiert ein Objekt oder ein Array aus einer JSON-Zeichenfolge.

Informationen zum Extrahieren eines Skalarwerts aus einer JSON-Zeichenfolge anstelle eines Objekts oder eines Array finden Sie unter JSON_VALUE (Transact-SQL). Informationen zu den Unterschieden zwischen JSON_VALUE und JSON_QUERY finden Sie unter Vergleichen von JSON_VALUE und JSON_QUERY.

Transact-SQL-Syntaxkonventionen

Syntax

JSON_QUERY ( expression [ , path ] )  

Argumente

expression

Ein Ausdruck. In der Regel der Name einer Variablen oder einer Spalte, die JSON-Text enthält.

Wenn JSON_QUERY sieht, dass JSON in expression ungültig ist, bevor sie den von path identifizierten Wert findet, gibt die Funktion einen Fehler zurück. Wenn JSON_QUERY den von path identifizierten Wert nicht ermittelt, wird der gesamte Text durchsucht und ein Fehler zurückgegeben, wenn JSON nirgendwo in expression gültig ist.

path

Ein JSON-Pfad, der das zu extrahierende Objekt oder Array angibt.

In SQL Server 2017 (14.x) und Azure SQL-Datenbank können Sie eine Variable als Wert von path bereitstellen.

Der JSON-Pfad kann den Lax- oder Strict-Modus für die Analyse angeben. Wenn Sie den Analysemodus nicht angeben, ist der Lax-Modus die Standardeinstellung. Weitere Informationen finden Sie unter JSON-Pfadausdrücke (SQL Server).

Der Standardwert für path lautet „$“. Wenn Sie also keinen Wert für path bereitstellen, gibt JSON_QUERY den Eingabe-Ausdruck zurück.

JSON_QUERY gibt einen Fehler zurück, wenn das Format von path ungültig ist.

Rückgabewert

Gibt ein JSON-Fragment vom Typ nvarchar(max) zurück. Die Sortierung des zurückgegebenen Werts ist identisch mit der Sortierung des Eingabeausdrucks.

Wenn der Wert kein Objekt oder Array ist:

  • Im Lax-Modus gibt JSON_QUERY Null zurück.

  • Im Strict-Modus gibt JSON_QUERY einen Fehler zurück.

Hinweise

Lax- und Strict-Modus

Betrachten Sie folgenden JSON-Text:

{
   "info": {
      "type": 1,
      "address": {
         "town": "Cheltenham",
         "county": "Gloucestershire",
         "country": "England"
      },
      "tags": ["Sport", "Water polo"]
   },
   "type": "Basic"
} 

Die folgende Tabelle vergleicht das Verhalten von JSON_QUERY im Lax-Modus und im Strict-Modus. Weitere Informationen zu den optionalen Pfadmodusangaben („Lax“ oder „Strict“) finden Sie unter JSON-Pfadausdrücke (SQL Server).

`Path` Rückgabewert im Lax-Modus Rückgabewert im Strict-Modus Weitere Informationen
$ Gibt den gesamten JSON-Text zurück. Gibt den gesamten JSON-Text zurück. Nicht zutreffend
$.info.type NULL Fehler Kein Objekt oder Array.

Verwenden Sie stattdessen JSON_VALUE.
$.info.address.town NULL Fehler Kein Objekt oder Array.

Verwenden Sie stattdessen JSON_VALUE.
$.info."address" N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' Nicht zutreffend
$.info.tags N'[ "Sport", "Water polo"]' N'[ "Sport", "Water polo"]' Nicht zutreffend
$.info.type[0] NULL Fehler Kein Array.
$.info.none NULL Fehler Die Eigenschaft ist nicht vorhanden.

Verwenden von JSON_QUERY mit FOR JSON

JSON_QUERY gibt ein gültiges JSON-Fragment zurück. Folglich versieht FOR JSON Sonderzeichen im Rückgabewert JSON_QUERY nicht mit Escapezeichen.

Wenn Sie verschiedene Ergebnisse mit FOR JSON zurückgeben und Sie Daten einschließen, die bereits im JSON-Format (in einer Spalte oder als Ergebnis eines Ausdrucks) vorhanden sind, dann umschließen Sie die JSON-Daten mit JSON_QUERY ohne den path-Parameter.

Beispiele

Beispiel 1

Im folgenden Beispiel wird gezeigt, wie ein JSON-Fragment einer CustomFields-Spalte in den Abfrageergebnissen zurückgegeben wird.

SELECT PersonID,FullName,
  JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People

Beispiel 2

Im folgende Beispiel wird gezeigt, wie JSON-Fragmente in die Ausgabe der FOR JSON-Klausel eingeschlossen werden.

SELECT StockItemID, StockItemName,
         JSON_QUERY(Tags) as Tags,
         JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH