sql >> Databasteknik >  >> RDS >> Sqlserver

Exempel på SQL Server FÖR JSON AUTO (T-SQL)

I SQL Server kan du använda FOR JSON klausul i en fråga för att formatera resultaten som JSON. När du gör detta måste du välja antingen AUTO eller PATH alternativ. Den här artikeln innehåller exempel på hur du använder AUTO alternativ.

Syntax

Syntaxen ser ut så här:

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

Så i princip, allt du behöver göra är att lägga till FOR JSON AUTO till slutet av din fråga.

Exempel 1 – Grundläggande användning

Här är ett exempel att visa.

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

Resultat:

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

Så resultaten kommer ut som ett snyggt formaterat JSON-dokument, istället för i rader och kolumner.

I det här fallet använde jag TOP 3 för att begränsa resultatuppsättningen till bara tre resultat.

Resultat från en rad?

Dina resultat kan till en början visas i en enda rad och en kolumn, och som en lång rad så här:

Om så är fallet, försök att klicka på resultatuppsättningen. Beroende på din databashanteringsprogramvara bör detta starta JSON-dokumentet som det visas i exemplet ovan.

Huruvida detta fungerar exakt som beskrivs beror på vilken programvara du använder för att fråga SQL Server.

I skrivande stund fungerade detta bra för mig när jag använde SQL Operations Studio (som sedan dess har döpts om till Azure Data Studio). Det fungerade också bra när du använde MSSQL-tillägget i VS Code. SSMS formaterar dock bara resultaten som en lång rad (men fortfarande i JSON-format).

Jag hade också olika grader av framgång med hjälp av kommandoradsverktyg.

Du kan också upptäcka att resultaten initialt fördelas över flera rader, beroende på hur stor resultatuppsättningen är.

Om du inte kan få det att visa resultaten på ett tillfredsställande sätt, prova ett annat verktyg.

Exempel 2 – Fråga över flera tabeller

I det här exemplet frågar jag två tabeller som har en en-till-många-relation mellan dem. I det här fallet kan varje artist ha många album.

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

Resultat:

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

Som du kan se har varje album kapslats under "Album". Detta beror på att AUTO alternativet bestämmer utdata baserat på ordningen på kolumner i SELECT lista och deras källtabeller.

Exempel 3 – Lägg till en rotnod

Du kan använda ROOT() alternativet för att lägga till en rotnod till utgången. Detta lägger till ett enda element på toppnivå till utdata. För att göra detta, lägg helt enkelt till ROOT() alternativet till slutet av frågan, med det namn du vill att rotnoden ska ha.

Så vi kan modifiera det föregående exemplet till detta:

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

Resultat:

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

Jag begränsade också resultatuppsättningen till bara tre resultat genom att lägga till TOP 3 till frågan.

Exempel 4 – Ta bort Array Wrapper

Du kan använda WITHOUT_ARRAY_WRAPPER alternativet för att ta bort hakparenteserna som omger resultaten.

Exempel:

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

Resultat:

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

Observera att om du gör detta på ett resultat med flera rader kommer du att få ogiltig JSON.


  1. Kolumnen finns inte?

  2. Hur hanterar man bäst historiska uppslagsvärden i en databas?

  3. 2 sätt att lista alla lagrade procedurer i MySQL

  4. Stöder PostgreSQL transparent komprimering av tabeller (fragment)?