sql >> Base de Datos >  >> RDS >> Sqlserver

Ejemplos de SQL Server FOR JSON AUTO (T-SQL)

En SQL Server puede usar FOR JSON cláusula en una consulta para formatear los resultados como JSON. Al hacer esto, debe elegir AUTO o la PATH opción. Este artículo contiene ejemplos del uso de AUTO opción.

Sintaxis

La sintaxis es así:

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

Básicamente, todo lo que necesita hacer es agregar FOR JSON AUTO hasta el final de su consulta.

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrarlo.

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

Resultado:

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

Entonces, los resultados aparecen como un documento JSON bien formateado, en lugar de filas y columnas.

En este caso utilicé TOP 3 para limitar el conjunto de resultados a solo tres resultados.

¿Resultados de una sola línea?

Sus resultados pueden aparecer inicialmente en una sola fila y una sola columna, y como una línea larga como esta:

Si este es el caso, intente hacer clic en el conjunto de resultados. Dependiendo de su software de administración de base de datos, esto debería iniciar el documento JSON como aparece en el ejemplo anterior.

Que esto funcione exactamente como se describe dependerá del software que utilice para consultar SQL Server.

En el momento de escribir este artículo, me funcionaba bien cuando usaba SQL Operations Studio (que desde entonces cambió su nombre a Azure Data Studio). También funcionó bien al usar la extensión MSSQL en VS Code. Sin embargo, SSMS solo formatea los resultados como una línea larga (aunque aún en formato JSON).

También tuve diversos grados de éxito con las herramientas de línea de comandos.

También puede encontrar que los resultados se distribuyen inicialmente en varias filas, según el tamaño del conjunto de resultados.

Si no puede hacer que muestre los resultados de manera satisfactoria, pruebe con una herramienta diferente.

Ejemplo 2:consulta en varias tablas

En este ejemplo, consulto dos tablas que tienen una relación de uno a muchos entre ellas. En este caso, cada artista puede tener muchos álbumes.

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

Resultado:

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

Como puede ver, cada álbum se ha anidado en "Álbumes". Esto se debe a que AUTO La opción determina la salida según el orden de las columnas en SELECT lista y sus tablas de origen.

Ejemplo 3:agregar un nodo raíz

Puedes usar el ROOT() opción para agregar un nodo raíz a la salida. Esto agrega un solo elemento de nivel superior a la salida. Para hacer esto, simplemente agregue el ROOT() opción al final de la consulta, con el nombre que desea que tenga el nodo raíz.

Entonces podemos modificar el ejemplo anterior a este:

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

Resultado:

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

También limité el conjunto de resultados a solo tres resultados agregando TOP 3 a la consulta.

Ejemplo 4:quitar el envoltorio de matriz

Puedes usar el WITHOUT_ARRAY_WRAPPER opción para eliminar los corchetes que rodean los resultados.

Ejemplo:

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

Resultado:

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

Tenga en cuenta que si hace esto en un resultado de varias filas, terminará con un JSON no válido.