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.