sql >> Databasteknik >  >> RDS >> Sqlserver

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

När du använder 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 PATH alternativ.

Syntax

Syntaxen ser ut så här:

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

Så i princip, allt du behöver göra är att lägga till FOR JSON PATH 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 PATH;

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 initialt visas i en enda rad och en enda 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 beskrivet beror på vilken programvara du använder för att fråga efter 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, och jag använder en underfråga för att hämta albumen för varje artist.

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;

Resultat:

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

I det här fallet har varje album kapslats under "Album". Detta beror på att albumen returneras via en underfråga.

Exempel 3 – Kapslad utdata med punktnotering

När du använder PATH alternativet kan du använda punktseparerade kolumnnamn för att skapa kapslade objekt.

För att göra detta, använd ett punktseparerat alias. Här är ett exempel:

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

Resultat:

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

Exempel 4 – 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 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH, ROOT('Albums');

Resultat:

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

Exempel 5 – 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 PATH, 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. Använder variabel i SQL LIKE-satsen

  2. Skrivoptimeringar för Qualcomm Centriq 2400 i MariaDB 10.3.5 Release Candidate

  3. Hur man förstår en FÖRKLARA ANALYS

  4. hur lägger man till superprivilegier till mysql-databasen?