Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server POUR JSON AUTO Exemples (T-SQL)

Dans SQL Server, vous pouvez utiliser le FOR JSON clause dans une requête pour formater les résultats au format JSON. Dans ce cas, vous devez choisir soit AUTO ou le PATH option. Cet article contient des exemples d'utilisation de AUTO option.

Syntaxe

La syntaxe ressemble à ceci :

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

Donc, en gros, tout ce que vous avez à faire est d'ajouter FOR JSON AUTO à la fin de votre requête.

Exemple 1 - Utilisation de base

Voici un exemple pour illustrer.

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

Résultat :

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

Ainsi, les résultats apparaissent sous la forme d'un document JSON bien formaté, au lieu de lignes et de colonnes.

Dans ce cas, j'ai utilisé TOP 3 pour limiter le jeu de résultats à seulement trois résultats.

Résultats sur une seule ligne ?

Vos résultats peuvent initialement apparaître sur une seule ligne et une seule colonne, et sur une longue ligne comme celle-ci :

Si tel est le cas, essayez de cliquer sur le jeu de résultats. En fonction de votre logiciel de gestion de base de données, cela devrait lancer le document JSON tel qu'il apparaît dans l'exemple ci-dessus.

Que cela fonctionne exactement comme décrit dépendra du logiciel que vous utilisez pour interroger SQL Server.

Au moment d'écrire ces lignes, cela fonctionnait bien pour moi lorsque j'utilisais SQL Operations Studio (qui a depuis été renommé Azure Data Studio). Cela a également bien fonctionné lors de l'utilisation de l'extension MSSQL dans VS Code. Cependant, SSMS ne formate les résultats que sur une longue ligne (bien que toujours au format JSON).

J'ai également eu plus ou moins de succès avec les outils de ligne de commande.

Vous pouvez également constater que les résultats sont initialement répartis sur plusieurs lignes, en fonction de la taille de l'ensemble de résultats.

Si vous ne parvenez pas à afficher les résultats de manière satisfaisante, essayez un autre outil.

Exemple 2 – Requête sur plusieurs tables

Dans cet exemple, j'interroge deux tables qui ont une relation un-à-plusieurs entre elles. Dans ce cas, chaque artiste peut avoir plusieurs albums.

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

Résultat :

[
    {
        "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"
            }
        ]
    }
]

Comme vous pouvez le voir, chaque album a été imbriqué sous "Albums". C'est parce que le AUTO L'option détermine la sortie en fonction de l'ordre des colonnes dans le SELECT list et leurs tables source.

Exemple 3 - Ajouter un nœud racine

Vous pouvez utiliser le ROOT() option pour ajouter un nœud racine à la sortie. Cela ajoute un seul élément de niveau supérieur à la sortie. Pour cela, il suffit d'ajouter le ROOT() option à la fin de la requête, avec le nom que vous voulez donner au nœud racine.

Nous pouvons donc modifier l'exemple précédent en ceci :

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');

Résultat :

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

J'ai également limité le jeu de résultats à seulement trois résultats en ajoutant TOP 3 à la requête.

Exemple 4 - Supprimer l'encapsuleur de tableau

Vous pouvez utiliser le WITHOUT_ARRAY_WRAPPER option pour supprimer les crochets qui entourent les résultats.

Exemple :

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

Résultat :

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

Notez que si vous faites cela sur un résultat à plusieurs lignes, vous vous retrouverez avec un JSON invalide.