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

SQL Server FOR JSON AUTO-Beispiele (T-SQL)

In SQL Server 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 AUTO Option.

Syntax

Die Syntax lautet wie folgt:

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

Im Grunde müssen Sie also nur FOR JSON AUTO 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 AUTO;

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 werden möglicherweise zunächst in einer einzelnen Zeile und einer einzelnen Spalte und als eine lange Linie wie folgt angezeigt:

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 hat dies bei mir mit SQL Operations Studio (das inzwischen in Azure Data Studio umbenannt wurde) problemlos funktioniert. 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 mehrere Alben haben.

USE Music;
SELECT 
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO;

Ergebnis:

[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    },
    {
        "ArtistName": "Buddy Rich",
        "Albums": [
            {
                "AlbumName": "Big Swing Face"
            }
        ]
    },
    {
        "ArtistName": "Devin Townsend",
        "Albums": [
            {
                "AlbumName": "Ziltoid the Omniscient"
            },
            {
                "AlbumName": "Casualties of Cool"
            },
            {
                "AlbumName": "Epicloud"
            }
        ]
    },
    {
        "ArtistName": "Iron Maiden",
        "Albums": [
            {
                "AlbumName": "Powerslave"
            },
            {
                "AlbumName": "Somewhere in Time"
            },
            {
                "AlbumName": "Piece of Mind"
            },
            {
                "AlbumName": "Killers"
            },
            {
                "AlbumName": "No Prayer for the Dying"
            }
        ]
    },
    {
        "ArtistName": "Jim Reeves",
        "Albums": [
            {
                "AlbumName": "Singing Down the Lane"
            }
        ]
    },
    {
        "ArtistName": "Michael Learns to Rock",
        "Albums": [
            {
                "AlbumName": "Blue Night"
            },
            {
                "AlbumName": "Eternity"
            },
            {
                "AlbumName": "Scandinavia"
            }
        ]
    },
    {
        "ArtistName": "The Script",
        "Albums": [
            {
                "AlbumName": "No Sound Without Silence"
            }
        ]
    },
    {
        "ArtistName": "Tom Jones",
        "Albums": [
            {
                "AlbumName": "Long Lost Suitcase"
            },
            {
                "AlbumName": "Praise and Blame"
            },
            {
                "AlbumName": "Along Came Jones"
            }
        ]
    }
]

Wie Sie sehen können, wurde jedes Album unter „Alben“ verschachtelt. Das liegt daran, dass AUTO Option bestimmt die Ausgabe basierend auf der Reihenfolge der Spalten in SELECT Liste und ihre Quelltabellen.

Beispiel 3 – 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
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO, ROOT('Music');

Ergebnis:

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

Außerdem habe ich die Ergebnismenge auf nur drei Ergebnisse begrenzt, indem ich TOP 3 hinzugefügt habe zur Abfrage.

Beispiel 4 – 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 AUTO, WITHOUT_ARRAY_WRAPPER;

Ergebnis:

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

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