Compartir a través de


Uso de la salida FOR JSON en el motor de base de datos de SQL y en aplicaciones cliente

Aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (solo servidor SQL pool)SQL database en Microsoft Fabric

En los ejemplos siguientes se muestran algunas de las formas de usar la cláusula FOR JSON y su salida JSON en SQL Server o en aplicaciones cliente. Para obtener más información, consulta Dar formato JSON a los resultados de consulta con FOR JSON.

En Fabric Data Warehouse, FOR JSON debe ser el último operador de la consulta, por lo que no se permite dentro de subconsultas, como en los ejemplos de este artículo.

Uso de la salida FOR JSON en las variables del motor de base de datos SQL

La salida de la cláusula FOR JSON es de tipo nvarchar(max), por lo que puede asignarla a cualquier variable, como se muestra en el ejemplo siguiente.

DECLARE @x NVARCHAR(MAX) =
  (SELECT TOP 10 *
     FROM Sales.SalesOrderHeader
     FOR JSON AUTO)  

Uso de la salida FOR JSON en las funciones definidas por el usuario del motor de base de datos de SQL

Puede crear funciones definidas por el usuario que formatean conjuntos de resultados como JSON y devuelven esta salida JSON. En el ejemplo siguiente se crea una función definida por el usuario que recupera algunas filas de detalle de pedido de ventas y las formatea como una matriz JSON.

CREATE FUNCTION GetSalesOrderDetails(@salesOrderId int)  
 RETURNS NVARCHAR(MAX)  
AS  
BEGIN  
   RETURN (SELECT UnitPrice, OrderQty  
           FROM Sales.SalesOrderDetail  
           WHERE SalesOrderID = @salesOrderId  
           FOR JSON AUTO)  
END

Puede utilizar esta función en un lote o una consulta, como se muestra en el ejemplo siguiente.

DECLARE @x NVARCHAR(MAX) = dbo.GetSalesOrderDetails(43659)

PRINT dbo.GetSalesOrderDetails(43659)

SELECT TOP 10
  H.*, dbo.GetSalesOrderDetails(H.SalesOrderId) AS Details
FROM Sales.SalesOrderHeader H

Fusionar datos de padre e hijo en una sola tabla

En el ejemplo siguiente, a cada conjunto de filas secundarias se le aplica el formato de una matriz JSON. La matriz JSON se convierte en el valor de la columna Detalles de la tabla principal.

SELECT TOP 10 SalesOrderId, OrderDate,  
      (SELECT TOP 3 UnitPrice, OrderQty  
         FROM Sales.SalesOrderDetail D  
         WHERE H.SalesOrderId = D.SalesOrderID  
         FOR JSON AUTO) AS Details  
INTO SalesOrder  
FROM Sales.SalesOrderHeader H  

Actualización de los datos en columnas JSON

En el ejemplo siguiente, se muestra que se puede actualizar el valor de una columna que contiene texto JSON.

UPDATE SalesOrder  
SET Details =  
     (SELECT TOP 1 UnitPrice, OrderQty  
       FROM Sales.SalesOrderDetail D  
       WHERE D.SalesOrderId = SalesOrder.SalesOrderId  
      FOR JSON AUTO) 

Uso de salidas FOR JSON en una aplicación cliente de C#

En el ejemplo siguiente se muestra cómo recuperar la salida JSON de una consulta en un objeto StringBuilder en una aplicación cliente de C#. Supongamos que la variable queryWithForJson contiene el texto de una instrucción SELECT con una cláusula FOR JSON.

var queryWithForJson = "SELECT ... FOR JSON";
using(var conn = new SqlConnection("<connection string>"))
{
    using(var cmd = new SqlCommand(queryWithForJson, conn))
    {
        conn.Open();
        var jsonResult = new StringBuilder();
        var reader = cmd.ExecuteReader();
        if (!reader.HasRows)
        {
            jsonResult.Append("[]");
        }
        else
        {
            while (reader.Read())
            {
                jsonResult.Append(reader.GetValue(0).ToString());
            }
        }
    }
}

Más información sobre JSON en el motor de base de datos de SQL

Para obtener una introducción visual a la compatibilidad integrada con JSON, consulte los vídeos siguientes: