sql >> Database teknologi >  >> RDS >> Sqlserver

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

I SQL Server kan du bruge FOR JSON klausul i en forespørgsel for at formatere resultaterne som JSON. Når du gør dette, skal du vælge enten AUTO eller PATH mulighed. Denne artikel indeholder eksempler på brug af AUTO mulighed.

Syntaks

Syntaksen ser sådan ud:

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

Så dybest set, alt hvad du skal gøre er at tilføje FOR JSON AUTO til slutningen af ​​din forespørgsel.

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere.

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å resultaterne kommer ud som et pænt formateret JSON-dokument i stedet for i rækker og kolonner.

I dette tilfælde brugte jeg TOP 3 for at begrænse resultatsættet til kun tre resultater.

Enkelt linje resultater?

Dine resultater kan til at begynde med vises i en enkelt række og en enkelt kolonne og som en lang linje som denne:

Hvis dette er tilfældet, prøv at klikke på resultatsættet. Afhængigt af din databasestyringssoftware bør dette starte JSON-dokumentet, som det vises i ovenstående eksempel.

Om dette fungerer nøjagtigt som beskrevet, afhænger af den software, du bruger til at forespørge efter SQL Server.

I skrivende stund fungerede dette fint for mig, når jeg brugte SQL Operations Studio (som siden er blevet omdøbt til Azure Data Studio). Det fungerede også fint, når du brugte MSSQL-udvidelsen i VS Code. SSMS formaterer dog kun resultaterne som én lang linje (dog stadig i JSON-format).

Jeg havde også forskellige grader af succes med at bruge kommandolinjeværktøjer.

Du kan også opleve, at resultaterne i starten er fordelt på flere rækker, afhængigt af hvor stort resultatsættet er.

Hvis du ikke kan få det til at vise resultaterne på en tilfredsstillende måde, så prøv et andet værktøj.

Eksempel 2 – Forespørgsel på tværs af flere tabeller

I dette eksempel forespørger jeg to tabeller, der har en en-til-mange-relation mellem dem. I dette tilfælde kan hver kunstner have mange 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, er hvert album blevet indlejret under "Albums". Dette skyldes, at AUTO option bestemmer output baseret på rækkefølgen af ​​kolonner i SELECT liste og deres kildetabeller.

Eksempel 3 – Tilføj en rodnode

Du kan bruge ROOT() mulighed for at tilføje en rodnode til outputtet. Dette tilføjer et enkelt element på øverste niveau til outputtet. For at gøre dette skal du blot tilføje ROOT() mulighed til slutningen af ​​forespørgslen med det navn, du ønsker, at rodknuden skal have.

Så vi kan ændre det foregående eksempel til dette:

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

Jeg begrænsede også resultatsættet til kun tre resultater ved at tilføje TOP 3 til forespørgslen.

Eksempel 4 – Fjern Array Wrapper

Du kan bruge WITHOUT_ARRAY_WRAPPER mulighed for at fjerne de firkantede parenteser, der omgiver resultaterne.

Eksempel:

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

Resultat:

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

Bemærk, at hvis du gør dette på et resultat med flere rækker, ender du med ugyldig JSON.


  1. Kan ikke tilføje eller opdatere en underordnet række:en begrænsning af en fremmednøgle mislykkes

  2. PostgreSQL funktionskald

  3. Kan SQL Server sende en webanmodning?

  4. Hvordan opretter man postgres-udvidelse inde i containeren?