Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beispiele für SQL Server FOR JSON PATH (T-SQL)

Wenn Sie SQL Server verwenden, können Sie den FOR JSON verwenden -Klausel in einer Abfrage, um die Ergebnisse als JSON zu formatieren. Dabei müssen Sie entweder AUTO auswählen oder der PATH Möglichkeit. Dieser Artikel enthält Beispiele für die Verwendung von PATH Option.

Syntax

Die Syntax lautet wie folgt:

SELECT ...
  (your query goes here)
FOR JSON PATH;

Im Grunde müssen Sie also nur FOR JSON PATH hinzufügen bis zum Ende Ihrer Anfrage.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein Beispiel zur Veranschaulichung.

USE Music;
SELECT TOP 3 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH;

Ergebnis:

[
    {
        "AlbumName": "Powerslave",
        "ReleaseDate": "1984-09-03"
    },
    {
        "AlbumName": "Powerage",
        "ReleaseDate": "1978-05-05"
    },
    {
        "AlbumName": "Singing Down the Lane",
        "ReleaseDate": "1956-01-01"
    }
]

Die Ergebnisse werden also als schön formatiertes JSON-Dokument ausgegeben, anstatt in Zeilen und Spalten.

In diesem Fall habe ich TOP 3 verwendet um die Ergebnismenge auf nur drei Ergebnisse zu beschränken.

Einzeilige Ergebnisse?

Ihre Ergebnisse können anfänglich in einer einzelnen Zeile und einer einzelnen Spalte und als eine lange Linie wie diese angezeigt werden:

Versuchen Sie in diesem Fall, auf die Ergebnismenge zu klicken. Abhängig von Ihrer Datenbankverwaltungssoftware sollte dies das JSON-Dokument starten, wie es im obigen Beispiel angezeigt wird.

Ob dies genau wie beschrieben funktioniert, hängt von der Software ab, die Sie zum Abfragen von SQL Server verwenden.

Zum Zeitpunkt des Verfassens dieses Artikels funktionierte dies bei Verwendung von SQL Operations Studio (das inzwischen in Azure Data Studio umbenannt wurde) einwandfrei. Es funktionierte auch gut, wenn die MSSQL-Erweiterung in VS Code verwendet wurde. SSMS formatiert die Ergebnisse jedoch nur als eine lange Zeile (allerdings immer noch im JSON-Format).

Ich hatte auch unterschiedlichen Erfolg mit Befehlszeilen-Tools.

Möglicherweise stellen Sie auch fest, dass die Ergebnisse zunächst auf mehrere Zeilen verteilt sind, je nachdem, wie groß die Ergebnismenge ist.

Wenn Sie die Ergebnisse nicht zufriedenstellend anzeigen können, versuchen Sie es mit einem anderen Tool.

Beispiel 2 – Abfrage über mehrere Tabellen hinweg

In diesem Beispiel frage ich zwei Tabellen ab, zwischen denen eine 1:n-Beziehung besteht. In diesem Fall kann jeder Künstler viele Alben haben, und ich verwende eine Unterabfrage, um die Alben für jeden Künstler abzurufen.

USE Music;
SELECT TOP 2 ArtistName,
    (SELECT AlbumName 
        FROM Albums
        WHERE Artists.ArtistId = Albums.ArtistId
        FOR JSON PATH) AS Albums
FROM Artists
ORDER BY ArtistName
FOR JSON PATH;

Ergebnis:

[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    }
]

In diesem Fall wurde jedes Album unter „Alben“ verschachtelt. Dies liegt daran, dass die Alben über eine Unterabfrage zurückgegeben werden.

Beispiel 3 – Verschachtelte Ausgabe mit Punktnotation

Bei Verwendung des PATH Option können Sie durch Punkte getrennte Spaltennamen verwenden, um verschachtelte Objekte zu erstellen.

Verwenden Sie dazu einen durch Punkte getrennten Alias. Hier ist ein Beispiel:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH;

Ergebnis:

[
    {
        "AlbumId": 1,
        "Details": {
            "Album Name": "Powerslave",
            "Release Date": "1984-09-03"
        }
    },
    {
        "AlbumId": 2,
        "Details": {
            "Album Name": "Powerage",
            "Release Date": "1978-05-05"
        }
    },
    {
        "AlbumId": 3,
        "Details": {
            "Album Name": "Singing Down the Lane",
            "Release Date": "1956-01-01"
        }
    }
]

Beispiel 4 – Wurzelknoten hinzufügen

Sie können den ROOT() verwenden Option zum Hinzufügen eines Stammknotens zur Ausgabe. Dadurch wird der Ausgabe ein einzelnes Element der obersten Ebene hinzugefügt. Fügen Sie dazu einfach den ROOT() hinzu Option am Ende der Abfrage, mit dem Namen, den der Stammknoten haben soll.

Wir können also das vorherige Beispiel wie folgt ändern:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH, ROOT('Albums');

Ergebnis:

{
    "Albums": [
        {
            "AlbumId": 1,
            "Details": {
                "Album Name": "Powerslave",
                "Release Date": "1984-09-03"
            }
        },
        {
            "AlbumId": 2,
            "Details": {
                "Album Name": "Powerage",
                "Release Date": "1978-05-05"
            }
        },
        {
            "AlbumId": 3,
            "Details": {
                "Album Name": "Singing Down the Lane",
                "Release Date": "1956-01-01"
            }
        }
    ]
}

Beispiel 5 – Entfernen Sie den Array-Wrapper

Sie können den WITHOUT_ARRAY_WRAPPER verwenden Option zum Entfernen der eckigen Klammern, die die Ergebnisse umgeben.

Beispiel:

USE Music;
SELECT TOP 1 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

Ergebnis:

{
    "AlbumName": "Powerslave",
    "ReleaseDate": "1984-09-03"
}

Beachten Sie, dass Sie, wenn Sie dies für ein Ergebnis mit mehreren Zeilen tun, am Ende ein ungültiges JSON erhalten.