Analizzare e trasformare dati JSON con OPENJSON
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
La funzione per i set di righe OPENJSON
consente di convertire testo JSON in un set di righe e colonne. Dopo aver trasformato una raccolta JSON in un set di righe con OPENJSON
, è possibile eseguire qualsiasi query SQL sui dati restituiti o inserirli in una tabella di SQL Server. Per altre informazioni sull'uso dei dati JSON nel motore di database di SQL Server, vedere Dati JSON in SQL Server.
La funzione OPENJSON
accetta un singolo oggetto JSON o una raccolta di oggetti JSON e li trasforma in una o più righe. Per impostazione predefinita la funzione OPENJSON
restituisce i dati seguenti:
- Da un oggetto JSON la funzione restituisce tutte le coppie chiave-valore trovate al primo livello.
- Da una matrice JSON la funzione restituisce tutti gli elementi della matrice con i rispettivi indici.
È possibile aggiungere una clausola WITH
facoltativa per specificare uno schema che definisce in modo esplicito la struttura dell'output.
OPENJSON con l'output predefinito
Quando si usa la funzione OPENJSON
senza specificare uno schema esplicito per i risultati, ovvero senza una clausola WITH
dopo OPENJSON
, la funzione restituisce una tabella con le tre colonne seguenti:
- Il
name
della proprietà nell'oggetto di input o l'indice dell'elemento nella matrice di input. - Il
value
della proprietà o l'elemento di matrice. - Il
type
, ad esempio stringa, numero, valore booleano, matrice o oggetto.
OPENJSON
restituisce ogni proprietà dell'oggetto JSON o ogni elemento della matrice come riga separata.
L’esempio che segue usa OPENJSON
con lo schema predefinito, ovvero senza la clausola WITH
facoltativa, e restituisce una riga per ogni proprietà dell'oggetto JSON.
DECLARE @json NVARCHAR(MAX);
SET @json='{ "name": "John", "surname": "Doe", "age": 45, "skills": [ "SQL", "C#", "MVC" ]}';
SELECT *
FROM OPENJSON(@json);
Il set di risultati è il seguente.
key | value | type |
---|---|---|
name |
John |
1 |
surname |
Doe |
1 |
age |
45 |
2 |
skills |
[ "SQL" ,"C#" ,"MVC" ] |
4 |
Per altre informazioni ed esempi, vedere Usare OPENJSON con lo schema predefinito.
Per la sintassi e l'utilizzo, vedere OPENJSON.
Output di OPENJSON con una struttura esplicita
Quando si specifica uno schema per i risultati tramite la clausola WITH
della funzione OPENJSON
, la funzione restituisce una tabella che include solo le colonne definite nella clausola WITH
. Nella clausola WITH
facoltativa specificare un set di colonne di output, i relativi tipi e i percorsi delle proprietà di origine JSON per ogni valore di output. OPENJSON
esegue l'iterazione della matrice di oggetti JSON, legge il valore nel percorso specificato per ogni colonna e converte il valore nel tipo specificato.
Nell'esempio seguente OPENJSON
viene usato con uno schema per l'output specificato in modo esplicito nella clausola WITH
.
DECLARE @json NVARCHAR(MAX);
SET @json = N'[
{
"Order": {
"Number": "SO43659",
"Date": "2024-05-31T00:00:00"
},
"AccountNumber": "AW29825",
"Item": {
"Price": 2024.9940,
"Quantity": 1
}
},
{
"Order": {
"Number": "SO43661",
"Date": "2024-06-01T00:00:00"
},
"AccountNumber": "AW73565",
"Item": {
"Price": 2024.9940,
"Quantity": 3
}
}
]';
SELECT *
FROM OPENJSON(@json) WITH (
Number VARCHAR(200) '$.Order.Number',
DATE DATETIME '$.Order.Date',
Customer VARCHAR(200) '$.AccountNumber',
Quantity INT '$.Item.Quantity'
);
Il set di risultati è il seguente.
Numero | Data | Customer | Quantità |
---|---|---|---|
SO43659 |
2024-05-31T00:00:00 |
AW29825 |
1 |
SO43661 |
2024-06-01T00:00:00 |
AW73565 |
3 |
Questa funzione restituisce e formatta gli elementi di una matrice JSON.
Per ogni elemento nella matrice JSON la funzione
OPENJSON
genera una nuova riga nella tabella di output. I due elementi nella matrice JSON vengono convertiti in due righe nella tabella restituita.Per ogni colonna, specificata usando la sintassi
colName type json_path
,OPENJSON
converte il valore trovato in ogni elemento della matrice nel percorso specificato del tipo specificato. In questo esempio i valori per la colonnaDate
sono ricavati da ogni elemento nel percorso$.Order.Date
e convertiti in valori datetime.
Per altre informazioni ed esempi, vedere Usare OPENJSON con uno schema esplicito (SQL Server).
Per la sintassi e l'utilizzo, vedere OPENJSON.
OPENJSON richiede il livello di compatibilità 130
La funzione OPENJSON
è disponibile solo nel livello di compatibilità 130
e superiore. Se il livello di compatibilità del database è inferiore a 130
, SQL Server non riesce a trovare e a eseguire la funzione OPENJSON
. Altre funzioni JSON predefinite sono disponibili in tutti i livelli di compatibilità.
È possibile controllare il livello di compatibilità nella vista sys.databases
o nelle proprietà del database e modificare il livello di compatibilità di un database usando il comando seguente:
ALTER DATABASE <DatabaseName> SET COMPATIBILITY_LEVEL = 130;
Contenuto correlato
- JSON as a bridge between NoSQL and relational worlds (JSON come ponte tra NoSQL e gli ambienti relazionali)
- OPENJSON (Transact-SQL)