Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

JSON in SQL Server

JSON (J avaS script O oggetto N otation) è uno standard molto popolare per lo scambio di dati specialmente nell'API REST. Quasi tutti i siti Web moderni, le app Android o iOS lo utilizzano per lo scambio di dati con il server. Da SQL Server 2016, Microsoft estende il supporto per JSON tramite un paio di funzioni integrate. In questo modo SQL Server supporta le funzionalità NOSQL nei database relazionali tradizionali. Esaminiamolo:

  • ISJSON:esamina una stringa indipendentemente dal fatto che sia un JSON valido o meno
  • JSON_VALUE – recupera il valore da una stringa JSON
  • JSON_QUERY – recupera l'oggetto o l'array da una stringa JSON
  • JSON_MODIFY – restituisce la stringa JSON aggiornata
  • OPENJSON – analizza il testo JSON e restituisce oggetti e proprietà dall'input JSON come righe e colonne
  • Clausola FOR JSON:esporta i dati SQL in formato JSON

Funzione ISJSON

DECLARE @json NVARCHAR(MAX); 
SET @json = N'{
"info":[
{
"id":"1",
"name":"Robert Aragon",
"ssn":"489-36-8350",
"credit_card":[
"4929-3813-3266-4295",
"5370-4638-8881-3020"
],
"address":{
"town":"Avon",
"area":"New York",
"zipcode":"76148"
}
},
{
"id":"2",
"name":"Thomas Conley",
"ssn":"690-05-5315",
"credit_card":[
"5299-1561-5689-1938"
],
"address":{
"town":"Jackson Street",
"area":"New York",
"zipcode":"80233"
}
},
{
"id":"3",
"name":"Susan Davis",
"ssn":"421-37-1396",
"credit_card":[
"5293-8502-0071-3058"
],
"address":{
"town":"Rock Beach",
"area":"Los angeles",
"zipcode":"900341"
}
},
{
"id":"4",
"name":"Christopher Diaz",
"ssn":"458-02-6124",
"credit_card":[
"5548-0246-6336-5664"
],
"address":{
"town":"Small town",
"area":"Wasshington",
"zipcode":"63126"
}
},
{
"id":"5",
"name":"Rick Edwards",
"ssn":"612-20-6832",
"credit_card":[
"4539-5385-7425-5825"
],
"address":{
"town":"Free Town",
"area":"Utah",
"zipcode":"97222"
}
},
{
"id":"6",
"name":"Victor Faulkner",
"ssn":"300-62-3266",
"credit_card":[
"4916-9766-5240-6147",
"4532-4220-6922-9909",
"5218-0144-2703-9266"
],
"address":{
"town":"Dakota",
"area":"North Dakota",
"zipcode":"92104"
}
}
]
}
'; 
SELECT ISJSON(@json);

Risultato

1 -- 1 if it is a valid JSON otherwise 0

Funzione JSON_VALUE

Questa funzione viene utilizzata per recuperare un valore scalare da una stringa JSON. La sua sintassi è

JSON_VALUE(expression, path)

espressione è il nome di una variabile o di una colonna che contiene testo JSON ed è la proprietà da estrarre. Ad esempio, l'esecuzione dell'istruzione seguente sulla stringa JSON sopra restituirà l'output seguente:

SELECT JSON_VALUE(@json, '$.info[3].credit_card[0]')

Risultato

5548-0246-6336-5664

La funzione JSON_VALUE restituisce un singolo valore di testo di tipo nvarchar(4000) . Restituisce null se il percorso specificato non viene trovato nell'oggetto JSON o il valore è oltre nvarchar(4000). Utilizzando 'rigoroso ' prima che il percorso genererà l'errore se il percorso specificato non è disponibile nell'oggetto JSON.

Funzione JSON_QUERY

Il La funzione JSON_QUERY(espressione [,percorso]) prende il nome di una variabile o di una colonna che contiene testo JSON e il percorso JSON che specifica l'oggetto o l'array da estrarre come argomenti.

Risultato

Restituisce un frammento JSON di tipo nvarchar(max) . Come la funzione JSON_VALUE restituisce null se il valore specificato non è un oggetto o una matrice. L'utilizzo della parola chiave "rigorosa" genererà l'errore.

Funzione JSON_MODIFY

Aggiorna il valore di una proprietà in una stringa JSON e restituisce la stringa JSON aggiornata. Prende espressione, percorso e nuovo come argomenti. Usando questa funzione, possiamo eseguire le seguenti operazioni su una stringa JSON:

  1. Aggiorna
  2. Inserisci
  3. Elimina
  4. Aggiungi
1. Aggiorna

Aggiorna il valore di un determinato percorso.

SELECT JSON_MODIFY(@json,'$.info[0].name', 'Mehedi')

Uscita

2. Inserisci

Il nuovo valore viene aggiunto nella stringa JSON se l'attributo nel percorso fornito non esiste. Altrimenti aggiornerà il valore esistente come nell'esempio sopra. Il nuovo attributo viene aggiunto alla fine del JSON.

SELECT JSON_MODIFY(@json,'$.info[0].last_name', 'Mehedi')

Uscita

3. Elimina

L'inserimento del valore NULL nel percorso lo rimuoverà.

SELECT JSON_MODIFY(@json,'$.info[0].name', NULL)

Uscita

4. Aggiungi

Il nuovo elemento può essere aggiunto nell'array come di seguito:

SELECT JSON_MODIFY(@json,'append $.info[0].credit_card','4539-5385-7425-5825')

Uscita

Funzione OPENJSON

Questa è una funzione con valori di tabella che analizza il testo JSON e restituisce oggetti e proprietà dall'input JSON come righe e colonne.

DECLARE @json NVARCHAR(MAX);
SET @json =
N'{"id":"1", "name": "Robert Aragon", "ssn": "489-36-8350",
"credit_card":["4929-3813-3266-4295","5370-4638-8881-3020"], "address":
{"town": "Avon", "area": "New York", "zipcode": "76148"}}';
SELECT * FROM OpenJson(@json)
with (
    id int  '$.id',
    name varchar(50) '$.name',
    ssn varchar(50) '$.ssn',
    [credit_card] nvarchar(MAX)  AS JSON,
    [address] nvarchar(MAX)  AS JSON
)

Risultato

Clausola FOR JSON

Questa clausola è ampiamente utilizzata con TSQL per esportare i dati della tabella SQL in formato JSON. Ha due varianti:

  • AUTO:l'output JSON predefinito viene generato utilizzando l'opzione AUTO.
  • PATH – La struttura di JSON può essere modificata dal nome della colonna o dagli alias usando l'opzione PATH
IF OBJECT_ID('Test1', 'U') IS NOT NULL
    DROP TABLE Test1;
GO

-- Create the table 
CREATE TABLE Test1( 
    pk_id    int not null identity(1,1), 
    name    varchar(10) default ('Mehedi') 
) 
 GO 
 -- Populate with 3 sample data 
 INSERT INTO Test1 default values
GO 2
IF OBJECT_ID('Test2', 'U') IS NOT NULL
    DROP TABLE Test2;
GO
-- Create the table
CREATE TABLE Test2(
    pk_id    int not null identity(1,1),
    area    varchar(10) default ('Dhanmondi'),
    city    varchar(10) default ('Dhaka')
)
GO
-- Populate with 3 sample data
INSERT INTO Test2 default values
GO 1
-- Example of AUTO
SELECT A.pk_id, A.name, (SELECT pk_id, area, city
    FROM Test2 B
    WHERE A.pk_id = B.pk_id
    FOR JSON AUTO
    ) as test2
FROM Test1 A
FOR JSON AUTO
-- Example of PATH
SELECT A.pk_id, A.name, (SELECT pk_id as id, area, city
    FROM Test2 B
    WHERE A.pk_id = B.pk_id
    FOR JSON AUTO
    ) as test2
FROM Test1 A
FOR JSON PATH , ROOT ('EmployeeInfo')
GO

Risultato

Conclusione

Questo è tutto sul JSON in SQL Server. Buon TSQL!

Questo articolo è tratto dal mio blog.