Usare l'output FOR JSON in SQL Server e nelle app client (SQL Server)
Si applica a: SQL Server 2016 (13.x) e alle sue versioni successive Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics (solo pool SQL serverless)
Gli esempi seguenti illustrano alcuni modi per usare la clausola FOR JSON e il relativo output JSON in SQL Server o nelle app client.
L'output della clausola FOR JSON è di tipo NVARCHAR(MAX), quindi può essere assegnato a qualsiasi variabile, come illustrato nell'esempio seguente.
DECLARE @x NVARCHAR(MAX) =
(SELECT TOP 10 *
FROM Sales.SalesOrderHeader
FOR JSON AUTO)
È possibile creare funzioni definite dall'utente che formattano i set di risultati come JSON e restituiscono questo output JSON. Nell'esempio seguente viene creata una funzione definita dall'utente che recupera alcune righe di dettaglio di un ordine di vendita e le formatta come matrice 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
Questa funzione può essere usata in un batch o in una query, come mostrato nell'esempio seguente.
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
Nell'esempio seguente ogni set di righe figlio è formattato come matrice JSON. La matrice JSON diventa il valore della colonna Dettagli nella tabella padre.
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
L'esempio seguente dimostra che è possibile aggiornare il valore di una colonna che contiene testo JSON.
UPDATE SalesOrder
SET Details =
(SELECT TOP 1 UnitPrice, OrderQty
FROM Sales.SalesOrderDetail D
WHERE D.SalesOrderId = SalesOrder.SalesOrderId
FOR JSON AUTO)
L'esempio seguente mostra come recuperare l'output JSON di una query in un oggetto StringBuilder in un'app client C#. Si supponga che la variabile queryWithForJson
contenga il testo dell'istruzione SELECT con una clausola 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());
}
}
}
}
Nota
Alcuni collegamenti video in questa sezione potrebbero non funzionare in questo momento. Microsoft sta eseguendo la migrazione di contenuti in precedenza su Channel 9 verso una nuova piattaforma. I collegamenti verranno aggiornati man mano che i video vengono migrati alla nuova piattaforma.
Per un'introduzione visiva al supporto JSON predefinito in SQL Server e nel database SQL di Azure, vedere i video seguenti:
- JSON as a bridge between NoSQL and relational worlds (JSON come ponte tra NoSQL e gli ambienti relazionali)
Formattare i risultati delle query in formato JSON con FOR JSON (SQL Server)