JSON-Daten in SQL Server

Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse Analytics

JSON ist ein beliebtes Textdatenformat, das zum Austauschen von Daten in modernen Webanwendungen und mobilen Anwendungen verwendet wird. JSON wird auch zum Speichern von unstrukturierten Daten in Protokolldateien oder NoSQL-Datenbanken wie Microsoft Azure Cosmos DB verwendet. Viele REST-Webdienste geben Ergebnisse zurück, die als JSON-Text formatiert sind, oder akzeptieren Daten, die im JSON-Format formatiert sind. Beispielsweise verfügen die meisten Azure-Dienste wie Azure Search, Azure Storage und Azure Cosmos DB über REST-Endpunkte, die JSON zurückgeben oder verarbeiten. JSON ist auch das hauptsächliche Format zum Austauschen von Daten zwischen Webseiten und Webservern über AJAX-Aufrufe.

MIT JSON-Funktionen, die in SQL Server 2016 (13.x) eingeführt wurden, können Sie NoSQL und relationale Konzepte in derselben Datenbank kombinieren. Sie können klassische relationale Spalten mit Spalten kombinieren, die Dokumente enthalten, die als JSON-Text in derselben Tabelle formatiert sind, JSON-Dokumente in relationalen Strukturen analysieren und importieren oder relationale Daten in JSON-Text formatieren.

Hinweis

Für die JSON-Unterstützung ist die Datenbankkompatibilitätsebene 130 oder höher erforderlich.

Hier ist ein Beispiel des JSON-Texts:

[
    {
        "name": "John",
        "skills": [ "SQL", "C#", "Azure" ]
    },
    {
        "name": "Jane",
        "surname": "Doe"
    }
]

Durch Verwenden von integrierten SQL Server-Funktionen und -Operatoren können Sie die folgenden Aktionen mit JSON-Text ausführen:

  • Analysieren Sie JSON-Text und lesen oder ändern Sie Werte.
  • Wandeln Sie Arrays von JSON-Objekten in das Tabellenformat um.
  • Wenden Sie eine beliebige Transact-SQL-Abfrage auf die konvertierte JSON-Objekte an.
  • Formatieren Sie die Ergebnisse der Transact-SQL-Abfragen in das JSON-Format.

Diagram showing the overview of built-in JSON support.

Wichtige JSON-Funktionen von SQL Server und SQL-Datenbank

In den nächsten Abschnitten werden die wichtigsten Funktionen erläutert, die SQL Server durch die integrierte Unterstützung für JSON bereitstellt.

Extrahieren von Werten aus JSON-Text und Verwenden dieser Werte in Abfragen

Wenn Sie JSON-Text verwenden, der in Datenbanktabellen gespeichert ist, können Sie Werte in dem JSON-Text lesen oder ändern, indem Sie die folgenden integrierten Funktionen verwenden:

Beispiel

Im folgenden Beispiel verwendet die Abfrage sowohl relationale als auch JSON-Daten (gespeichert in einer Spalte mit dem Namen ) aus einer Tabelle mit dem Namen jsonColPeople:

SELECT Name,
    Surname,
    JSON_VALUE(jsonCol, '$.info.address.PostCode') AS PostCode,
    JSON_VALUE(jsonCol, '$.info.address."Address Line 1"')
        + ' ' + JSON_VALUE(jsonCol, '$.info.address."Address Line 2"') AS Address,
    JSON_QUERY(jsonCol, '$.info.skills') AS Skills
FROM People
WHERE ISJSON(jsonCol) > 0
    AND JSON_VALUE(jsonCol, '$.info.address.Town') = 'Belgrade'
    AND STATUS = 'Active'
ORDER BY JSON_VALUE(jsonCol, '$.info.address.PostCode');

Anwendungen und Tools erkennen keinen Unterschied zwischen den Werten aus skalaren Tabellenspalten und denen aus JSON-Spalten. Sie können Werte aus dem JSON-Text in jedem Teil der Transact-SQL-Abfrage verwenden (z.B. WHERE-, ORDER BY-, GROUP BY-Klauseln, Fenster-Aggregate usw.). JSON-Funktionen verwenden eine JavaScript-ähnliche Syntax zum Verweisen auf Werte in JSON-Text.

Weitere Informationen finden Sie unter Validate, Query, and Change JSON Data with Built-in Functions (SQL Server), JSON_VALUE (Transact-SQL) und JSON_QUERY (Transact-SQL).

Ändern der JSON-Werte

Wenn Sie Teile des JSON-Texts ändern müssen, können Sie die JSON_MODIFY (Transact-SQL)-Funktion verwenden, um den Wert einer Eigenschaft in einer JSON-Zeichenfolge zu aktualisieren und die aktualisierte JSON-Zeichenfolge zurückzugeben. Im folgenden Beispiel wird der Wert einer Eigenschaft in einer Variablen aktualisiert, die JSON enthält:

DECLARE @json NVARCHAR(MAX);

SET @json = '{"info": {"address": [{"town": "Belgrade"}, {"town": "Paris"}, {"town":"Madrid"}]}}';
SET @json = JSON_MODIFY(@json, '$.info.address[1].town', 'London');

SELECT modifiedJson = @json;

Hier ist das Resultset.

{"info":{"address":[{"town":"Belgrade"},{"town":"London"},{"town":"Madrid"}]}}

Konvertieren der JSON-Sammlungen in ein Rowset

Eine benutzerdefinierte Abfragesprache ist zur Abfrage von JSON-Daten in SQL Server nicht erforderlich. Zum Abfragen von JSON-Daten können Sie Standard-T-SQL verwenden. Wenn Sie eine Abfrage oder einen Bericht zu JSON-Daten erstellen müssen, können Sie JSON-Daten einfach in Zeilen und Spalten konvertieren, indem Sie die OPENJSON Rowset-Funktion aufrufen. Weitere Informationen finden Sie unter Analysieren und Transformieren von JSON-Daten mit OPENJSON.

Im folgenden Beispiel wird das Array von Objekten aufgerufen OPENJSON und transformiert, die in der @json Variablen gespeichert sind, in ein Rowset, das mit einer Transact-SQL-Standardanweisung SELECT abgefragt werden kann:

DECLARE @json NVARCHAR(MAX);

SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';

SELECT *
FROM OPENJSON(@json) WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob'
);

Hier ist das Resultset.

ID firstName lastName age dateOfBirth
2 John Smith 25
5 Jane Smith 2005-11-04T12:00:00

OPENJSON transformiert das Array von JSON-Objekten in eine Tabelle, in der jedes Objekt als eine Zeile dargestellt wird, und Schlüssel-Wert-Paare werden als Zellen zurückgegeben. Die Ausgabe verwendet die folgenden Regeln:

  • OPENJSON konvertiert JSON-Werte in die Typen, die in der WITH Klausel angegeben sind.
  • OPENJSON kann sowohl Flache Schlüssel-Wert-Paare als auch geschachtelte, hierarchisch angeordnete Objekte verarbeiten.
  • Sie müssen nicht alle Felder zurückgeben, die im JSON-Text enthalten sind.
  • Wenn JSON-Werte nicht vorhanden sind, OPENJSON werden Werte zurückgegeben NULL .
  • Sie können optional einen Pfad zu der Typspezifikation angeben, um auf eine geschachtelte Eigenschaft, oder um mit einem anderen Namen auf eine Eigenschaft zu verweisen.
  • Das optionale strict Präfix im Pfad gibt an, dass Werte für die angegebenen Eigenschaften im JSON-Text vorhanden sein müssen.

Weitere Informationen finden Sie unter Analysieren und Transformieren von JSON-Daten mit OPENJSON und OPENJSON (Transact-SQL).

JSON-Dokumente verfügen möglicherweise über Unterelemente und hierarchische Daten, die nicht direkt den standardmäßigen relationalen Spalten zugeordnet werden können. Sie können in diesem Fall die JSON-Hierarchie vereinfachen, indem Sie die übergeordnete Entität mit untergeordneten Arrays verknüpfen.

Im folgenden Beispiel weist das zweite Objekt des Arrays untergeordnete Arrays auf, die Fähigkeiten von Personen darstellen (Skills-Array). Jedes untergeordnete Objekt kann mithilfe des zusätzlichen Funktionsaufrufs OPENJSON analysiert werden:

DECLARE @json NVARCHAR(MAX);

SET @json = N'[
  {"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
  {"id": 5, "info": {"name": "Jane", "surname": "Smith", "skills": ["SQL", "C#", "Azure"]}, "dob": "2005-11-04T12:00:00"}
]';

SELECT id,
    firstName,
    lastName,
    age,
    dateOfBirth,
    skill
FROM OPENJSON(@json) WITH (
    id INT 'strict $.id',
    firstName NVARCHAR(50) '$.info.name',
    lastName NVARCHAR(50) '$.info.surname',
    age INT,
    dateOfBirth DATETIME2 '$.dob',
    skills NVARCHAR(MAX) '$.info.skills' AS JSON
)
OUTER APPLY OPENJSON(skills) WITH (skill NVARCHAR(8) '$');

Das skills Array wird im ersten OPENJSON als ursprüngliches JSON-Textfragment zurückgegeben und mithilfe des APPLY Operators an eine andere OPENJSON Funktion übergeben. Die zweite OPENJSON Funktion analysiert JSON-Array und gibt Zeichenfolgenwerte als einspaltiges Rowset zurück, das mit dem Ergebnis des ersten OPENJSONverknüpft wird.

Hier ist das Resultset.

ID firstName lastName age dateOfBirth skill
2 John Smith 25
5 Jane Smith 2005-11-04T12:00:00 SQL
5 Jane Smith 2005-11-04T12:00:00 C#
5 Jane Smith 2005-11-04T12:00:00 Azure

OUTER APPLY OPENJSON verknüpft die Entität der ersten Ebene mit einem Untergeordneten Array und gibt ein flaches Resultset zurück. Aufgrund von JOIN wird die zweite Zeile für jede Fähigkeit wiederholt.

Konvertieren von SQL Server-Daten in JSON oder Exportieren von JSON

Hinweis

Das Konvertieren von Azure Synapse Analytics-Daten in JSON oder das Exportieren von JSON wird nicht unterstützt.

Formatieren Sie SQL Server-Daten oder die Ergebnisse von SQL-Abfragen als JSON, indem Sie die FOR JSON Klausel zu einer SELECT Anweisung hinzufügen. Hier können Sie FOR JSON die Formatierung der JSON-Ausgabe von Ihren Clientanwendungen an SQL Server delegieren. Weitere Informationen finden Sie unter Formatieren von Abfrageergebnissen als JSON mit FOR JSON.

Im folgenden Beispiel wird der PATH-Modus mit der FOR JSON Klausel verwendet:

SELECT id,
    firstName AS "info.name",
    lastName AS "info.surname",
    age,
    dateOfBirth AS dob
FROM People
FOR JSON PATH;

Die FOR JSON Klausel formatiert SQL-Ergebnisse als JSON-Text, der für jede App bereitgestellt werden kann, die JSON versteht. Die Option PATH verwendet in der SELECT-Klausel durch Punkte getrennte Aliase, um Objekte in den Abfrageergebnissen zu schachteln.

Hier ist das Resultset.

[
  {
    "id": 2,
    "info": {
      "name": "John",
      "surname": "Smith"
    },
    "age": 25
  },
  {
    "id": 5,
    "info": {
      "name": "Jane",
      "surname": "Smith"
    },
    "dob": "2005-11-04T12:00:00"
  }
]

Weitere Informationen finden Sie unter "Formatieren von Abfrageergebnissen als JSON mit FOR JSON und FOR Clause (Transact-SQL)".

Anwendungsfälle für JSON-Daten in SQL Server

Durch die JSON-Unterstützung in SQL Server und Azure SQL-Datenbank können Sie relationale Konzepte mit NoSQL-Konzepten verbinden. Dadurch lassen sich relationale Daten leicht in teilweise strukturierte Daten und umgekehrt transformieren. JSON ist jedoch kein Ersatz für vorhandene relationale Modelle. Im Folgenden werden einige spezifische Anwendungsfälle beschrieben, in denen die JSON-Unterstützung in SQL Server und SQL-Datenbank genutzt wird.

Vereinfachen komplexer Datenmodelle

Denormalisieren Sie Ihr Datenmodell mit JSON-Feldern anstelle von mehreren untergeordneten Tabellen.

Speichern von Einzelhandels- und E-Commerce-Daten

Speichern Sie Informationen über Produkte mit vielen veränderbaren Attributen in einem denormalisierten Modell, um mehr Flexibilität zu erhalten.

Verarbeiten von Protokoll- und Telemetriedaten

Laden Sie als JSON-Dateien gespeicherte Protokolldaten, fragen Sie diese ab und analysieren Sie sie mithilfe der leistungsfähigen Programmiersprache Transact-SQL.

Speichern von teilweise strukturieren IoT-Daten

Laden Sie bei einer Echtzeitanalyse von IoT-Daten eingehende Daten direkt in die Datenbank, anstatt sie durch Staging an einem Speicherort bereitzustellen.

Vereinfachen der REST-API-Entwicklung

Transformieren Sie relationale Daten aus Ihrer Datenbank problemlos in das JSON-Format, das von den REST-APIs verwendet wird, die Ihre Website unterstützen.

Kombinieren von relationalen und JSON-Daten

SQL Server bietet ein Hybridmodell zum Speichern und Verarbeiten von relationalen Daten und JSON-Daten, indem die Transact-SQL-Standardsprache verwendet wird. Sie können Sammlungen Ihrer JSON-Dokumente nach Tabellen anordnen, Beziehungen zwischen ihnen herstellen, in Tabellen gespeicherte, stark typisierte Skalarspalten mit flexiblen Schlüssel-Wert/Paaren kombinieren, die in JSON-Spalten gespeichert werden, und sowohl Skalarwerte als auch JSON-Werte in einer oder mehreren Tabellen abfragen, indem Sie vollständiges Transact-SQL verwenden.

JSON-Text wird in VARCHAR- oder NVARCHAR-Spalten gespeichert und als Nur-Text indiziert. Jede SQL Server-Funktion oder -Komponente, die Text unterstützt, unterstützt auch JSON, daher gibt es fast keine Einschränkungen hinsichtlich der Interaktion zwischen JSON und anderen SQL Server-Funktionen. Sie können JSON im Arbeitsspeicher oder in temporalen Tabellen speichern, Sicherheitsprädikate auf Zeilenebene auf JSON-Text anwenden usw.

Im Folgenden finden Sie einige Anwendungsfälle, in denen gezeigt wird, wie Sie die integrierte JSON-Unterstützung in SQL Server verwenden können.

Speichern und Indizieren von JSON-Daten in SQL Server

JSON ist ein Textformat. Deshalb können JSON-Dokumente in einer SQL-Datenbank-Instanz in NVARCHAR-Spalten gespeichert werden. Da NVARCHAR der Typ in allen SQL Server-Subsystemen unterstützt wird, können Sie JSON-Dokumente in Tabellen mit gruppierten Spaltenspeicherindizes, speicheroptimierten Tabellen oder externen Dateien einfügen, die mit OPENROWSET oder PolyBase gelesen werden können.

Weitere Informationen zu den verschiedenen Optionen zum Speichern, Indizieren und Optimieren von JSON-Daten in SQL Server finden Sie unter:

Laden von JSON-Dateien in SQL Server

Sie können Informationen, die in Dateien gespeichert sind, als Standard-JSON oder als JSON-Text formatieren, in dem Zeilenumbrüche als Trennzeichen verwendet werden. SQL Server kann den Inhalt von JSON-Dateien importieren, mithilfe OPENJSON der Funktionen JSON_VALUE analysieren und in Tabellen laden.

  • Wenn Ihre JSON-Dokumente in lokalen Dateien, auf freigegebenen Netzlaufwerken oder ein Azure Files-Speicherorten gespeichert sind, auf die SQL Server zugreifen kann, können Sie einen Massenimport durchführen, um die JSON-Daten in SQL Server zu laden.

  • Wenn Ihre JSON-Dateien, die Zeilenumbrüche als Trennzeichen verwenden, in Azure-Blobspeicher oder im Hadoop-Dateisystem gespeichert werden, können Sie den JSON-Text mithilfe von PolyBase laden, in Transact-SQL-Code analysieren und in Tabellen laden.

Importieren von JSON-Daten in SQL Server-Tabellen

Wenn Sie JSON-Daten aus einem externen Dienst in SQL Server laden müssen, können OPENJSON Sie die Daten in SQL Server importieren, anstatt die Daten auf der Anwendungsebene zu analysieren.

DECLARE @jsonVariable NVARCHAR(MAX);

SET @jsonVariable = N'[
  {
    "Order": {
      "Number":"SO43659",
      "Date":"2011-05-31T00:00:00"
    },
    "AccountNumber":"AW29825",
    "Item": {
      "Price":2024.9940,
      "Quantity":1
    }
  },
  {
    "Order": {
      "Number":"SO43661",
      "Date":"2011-06-01T00:00:00"
    },
    "AccountNumber":"AW73565",
    "Item": {
      "Price":2024.9940,
      "Quantity":3
    }
  }
]';

-- INSERT INTO <sampleTable>
SELECT SalesOrderJsonData.*
FROM OPENJSON(@jsonVariable, N'$') WITH (
    Number VARCHAR(200) N'$.Order.Number',
    Date DATETIME N'$.Order.Date',
    Customer VARCHAR(200) N'$.AccountNumber',
    Quantity INT N'$.Item.Quantity'
) AS SalesOrderJsonData;

Sie können den Inhalt der JSON-Variablen durch eine externen REST-Dienst bereitstellen, als Parameter aus einem clientseitigen JavaScript-Framework senden oder aus externen Dateien laden. Sie können Ergebnisse aus JSON-Text ganz einfach in eine SQL Server-Tabelle einfügen, dort aktualisieren oder zusammenführen.

Analysieren von JSON-Daten mit SQL-Abfragen

Wenn Sie JSON-Daten zu Berichtszwecken filtern oder aggregieren müssen, können OPENJSON Sie JSON in relationales Format transformieren. Sie können dann Standard-Transact-SQL-Funktionen oder integrierte Funktionen verwenden, um die Berichte vorzubereiten.

SELECT Tab.Id,
    SalesOrderJsonData.Customer,
    SalesOrderJsonData.Date
FROM SalesOrderRecord AS Tab
CROSS APPLY OPENJSON(Tab.json, N'$.Orders.OrdersArray') WITH (
    Number VARCHAR(200) N'$.Order.Number',
    Date DATETIME N'$.Order.Date',
    Customer VARCHAR(200) N'$.AccountNumber',
    Quantity INT N'$.Item.Quantity'
) AS SalesOrderJsonData
WHERE JSON_VALUE(Tab.json, '$.Status') = N'Closed'
ORDER BY JSON_VALUE(Tab.json, '$.Group'),
    Tab.DateModified;

Sie können sowohl Standardtabellenspalten als auch Werte aus JSON-Text in derselben Abfrage verwenden. Sie können Indizes zum JSON_VALUE(Tab.json, '$.Status')-Ausdruck hinzufügen, um die Leistung der Abfrage zu verbessern. Weitere Informationen finden Sie unter Indizieren von JSON-Daten.

Rückgabe von Daten aus einer SQL Server-Tabelle im JSON-Format

Wenn Sie einen Webdienst verwenden, der Daten von der Datenbankebene übernimmt und sie im JSON-Format zurückgibt, oder wenn Sie JavaScript-Frameworks oder -Bibliotheken haben, die Daten im JSON-Format akzeptieren, können Sie JSON-Ausgabe direkt in einer SQL-Abfrage formatieren. Anstatt Code zu schreiben oder eine Bibliothek zum Konvertieren von Tabellenabfrageergebnissen zu verwenden und dann Objekte im JSON-Format zu serialisieren, können FOR JSON Sie die JSON-Formatierung an SQL Server delegieren.

Sie können z.B. eine JSON-Ausgabe generieren, die der OData-Spezifikation entspricht. Der Webdienst erwartet eine Anforderung und Antwort im folgenden Format:

  • Anforderung: /Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName

  • Antwort: {"@odata.context": "https://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity", "ProductID": 1, "ProductName": "Chai"}

Diese OData-URL stellt eine Anforderung für die Spalten „ProductID“ und „ProductName“ für das Produkt mit der ID 1 dar. Sie können FOR JSON die Ausgabe wie erwartet in SQL Server formatieren.

SELECT 'https://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity' AS '@odata.context',
  ProductID,
  Name as ProductName
FROM Production.Product
WHERE ProductID = 1
FOR JSON AUTO;

Die Ausgabe dieser Abfrage ist JSON-Text, der vollständig mit der OData-Spezifikation kompatibel ist. Formatierungen und Escapezeichen werden von SQL Server behandelt. SQL Server kann Abfrageergebnisse auch in einem beliebigen Format formatieren, etwa OData JSON oder GeoJSON.

Testen Sie die integrierte JSON-Unterstützung mithilfe der AdventureWorks-Beispieldatenbank.

Laden Sie zum Abrufen der AdventureWorks-Beispieldatenbank zumindest die Datenbankdatei und die Beispiel- und Skriptdatei von GitHub herunter.

Nachdem Sie die Beispieldatenbank in einer Instanz von SQL Server wiederhergestellt haben, extrahieren Sie die Beispieldatei, und öffnen Sie dann die JSON Sample Queries procedures views and indexes.sql Datei aus dem JSON-Ordner. Führen Sie die Skripts in dieser Datei aus, um einige der vorhandenen Daten als JSON-Daten neu zu formatieren, testen Sie Beispielabfragen und -berichte für die JSON-Daten, indizieren Sie die JSON-Daten, und importieren und exportieren Sie JSON.

Mit den Skripts, die in der Datei enthalten sind, haben Sie die folgenden Möglichkeiten:

  • Denormalisieren Sie die vorhandenen Schemas, um Spalten mit JSON-Daten zu erstellen.

    • Speichern Sie Informationen aus SalesReasons, SalesOrderDetails, SalesPerson, Customer und anderen Tabellen, die Informationen im Zusammenhang mit dem Auftrag enthalten, in JSON-Spalten in der SalesOrder_json-Tabelle.

    • Speichern Sie Informationen aus EmailAddresses und PersonPhone Tabellen in der Person_json Tabelle als Arrays von JSON-Objekten.

  • Erstellen Sie Prozeduren und Sichten, die JSON-Daten abfragen.

  • Indizieren Sie die JSON-Daten. Erstellen Sie Indizes zu JSON-Eigenschaften und Volltextindizes.

  • Importieren und exportieren Sie JSON. Erstellen Sie Prozeduren und führen sie aus, die den Inhalt der Tabellen Person und SalesOrder als JSON-Ergebnisse exportieren, und importieren und exportieren Sie die Tabellen Person und SalesOrder mithilfe der JSON-Eingabe.

  • Führen Sie Abfragebeispiele aus. Führen Sie einige Abfragen aus, die die gespeicherten Prozeduren und Sichten aufrufen, die Sie in den Schritten 2 und 4 erstellt haben.

  • Bereinigen Sie Skripts. Führen Sie diesen Teil nicht aus, wenn Sie die gespeicherten Prozeduren und Sichten beibehalten möchten, die Sie in den Schritten 2 und 4 erstellt haben.

Weitere Informationen zu JSON in SQL Server und Azure SQL-Datenbank

Microsoft-Videos

Eine visuelle Einführung in die JSON-Unterstützung, die in SQL Server und Azure SQL-Datenbank integriert ist, finden Sie in den folgenden Videos: