sql >> Database >  >> RDS >> Sqlserver

SQL Server VOOR JSON AUTO Voorbeelden (T-SQL)

In SQL Server kunt u de FOR JSON . gebruiken clausule in een query om de resultaten op te maken als JSON. Wanneer u dit doet, moet u kiezen voor de AUTO of het PATH optie. Dit artikel bevat voorbeelden van het gebruik van de AUTO optie.

Syntaxis

De syntaxis gaat als volgt:

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

Dus eigenlijk hoef je alleen maar FOR JSON AUTO . toe te voegen aan het einde van uw zoekopdracht.

Voorbeeld 1 – Basisgebruik

Hier is een voorbeeld om te demonstreren.

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

Resultaat:

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

Dus de resultaten komen eruit als een mooi opgemaakt JSON-document, in plaats van in rijen en kolommen.

In dit geval gebruikte ik TOP 3 om de resultaatset te beperken tot slechts drie resultaten.

Resultaten uit één regel?

Uw resultaten kunnen aanvankelijk worden weergegeven in een enkele rij en een enkele kolom, en als een lange regel, zoals deze:

Als dit het geval is, probeer dan op de resultatenset te klikken. Afhankelijk van uw databasebeheersoftware zou dit het JSON-document moeten starten zoals het in het bovenstaande voorbeeld wordt weergegeven.

Of dit precies werkt zoals beschreven, hangt af van de software die u gebruikt om SQL Server te doorzoeken.

Op het moment van schrijven werkte dit prima voor mij bij het gebruik van SQL Operations Studio (dat sindsdien is hernoemd naar Azure Data Studio). Het werkte ook prima bij het gebruik van de MSSQL-extensie in VS Code. SSMS formatteert de resultaten echter alleen als één lange regel (hoewel nog steeds in JSON-indeling).

Ik had ook wisselend succes met het gebruik van opdrachtregelprogramma's.

Het kan ook zijn dat de resultaten aanvankelijk over meerdere rijen zijn verdeeld, afhankelijk van hoe groot de resultatenset is.

Als het je niet lukt om de resultaten op een bevredigende manier weer te geven, probeer dan een andere tool.

Voorbeeld 2 – Zoekopdracht over meerdere tabellen

In dit voorbeeld voer ik een query uit op twee tabellen die een een-op-veel-relatie hebben. In dit geval kan elke artiest veel albums hebben.

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

Resultaat:

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

Zoals je kunt zien, is elk album genest onder "Albums". Dit komt omdat de AUTO optie bepaalt de uitvoer op basis van de volgorde van kolommen in de SELECT lijst en hun brontabellen.

Voorbeeld 3 – Voeg een Root Node toe

U kunt de ROOT() . gebruiken optie om een ​​hoofdknooppunt aan de uitvoer toe te voegen. Dit voegt een enkel element op het hoogste niveau toe aan de uitvoer. Om dit te doen, voegt u eenvoudig de ROOT() . toe optie aan het einde van de query, met de naam die u wilt dat het hoofdknooppunt heeft.

Dus we kunnen het vorige voorbeeld hieraan aanpassen:

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

Resultaat:

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

Ik heb de resultatenset ook beperkt tot slechts drie resultaten door TOP 3 toe te voegen op de vraag.

Voorbeeld 4 – Verwijder de array-wrapper

U kunt de WITHOUT_ARRAY_WRAPPER . gebruiken optie om de vierkante haken rond de resultaten te verwijderen.

Voorbeeld:

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

Resultaat:

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

Houd er rekening mee dat als u dit doet op een resultaat met meerdere rijen, u een ongeldige JSON krijgt.


  1. Query om alle rijen van de vorige maand te krijgen

  2. Hoe voeg ik een automatisch oplopende primaire sleutel toe aan een bestaande tabel in PostgreSQL?

  3. ORA-00984:kolom hier niet toegestaan

  4. Hoe de korte maandnaam van een datum in MariaDB te krijgen?