SQL Server 2016 porterà tantissime novità, tra cui, per quanto riguarda la programmabilità, il supporto al formato JSON. vedremo com'è possibile serializzare i risultati delle nostre query tramite la clausola FOR JSON, inclusa negli ultimi rilasci della piattaforma.
7. #sqlsatParma
#sqlsat462November 28°, 2015
Supporto per il formato JSON nativo
Dalla CTP 2
Prima di 2016, T-SQL complesso e CPU intensive
Anche in tabelle In-Memory OLTP
Non è un tipo di dato come XML
È una stringa, si gestisce con (n)varchar()
Parser nativo al momento dell’esecuzione della query
Per ora, qualora richiesto, proporre su CONNECT
9. #sqlsatParma
#sqlsat462November 28°, 2015
JSON – concetti
Acronimo di JavaScript Object Notation
Basato su JavaScript, ma indipendente
Tipi di dato comuni: bool, int, real, string, array, null
Stringa, non markup
Esempio:
{
“first”: “Alessandro”,
“last”: “Alpi”
“age”: “34”,
“courses”: [
{“code”: “C001”, “name”: “SQL Server Querying”},
{“code”: “C002”, “name”: “Administering SQL Server”},
{“code”: “C003”, “name”: “Troubleshooting SQL Server”},
]
}
10. #sqlsatParma
#sqlsat462November 28°, 2015
JSON – concetti
Estremamente leggero e semplice
Perfetto per la rappresentazione dei dati
Leggibile ed autodescrittivo/Portabile (può sostituire XML)
Ottimo per AJAX/Javascript
“ per “name” e “value”
: per “name”:”value”
Special char rappresentati con escape (r, t, ecc.)
{ } object (graffe)
[ , ] array (quadre)
[ { }, { } ] array di object
11. #sqlsatParma
#sqlsat462November 28°, 2015
Formato
nvarchar, varchar, nchar, char -> string
int, bigint, float, decimal, numeric -> number
bit -> Boolean (true, false)
datetime, date, datetime2, time, datetimeoffset -> string
Uniqueidentifier, money, binary -> string e BASE64 string
12. #sqlsatParma
#sqlsat462November 28°, 2015
JSON vs XML
Formato leggero
Text based
Parser integrato query
Processing
JsonPath/T-SQL
Indici “normali”
Funzionalità molteplici
Tipizzazione forte
Parser DOM
Processing
XPath/XQuery/T-SQL
Indici XML dedicati
13. #sqlsatParma
#sqlsat462November 28°, 2015
SQL Server vs DocumentDB
Motore ibrido
Tabelle e JSON string
Funzionalità generiche
Query Processing
T-SQL completo
Indici “normali”
Supporto alle collation
Motore JSON
Solo e specializzato per JSON
Ottimizzato per le scritture
Processing
SQL per DocumentDB
Indici “automatici”
16. #sqlsatParma
#sqlsat462November 28°, 2015
Funzionalità di export
PATH
FOR JSON PATH
AUTO
FOR JSON AUTO
Opzione ROOT
FOR JSON AUTO, ROOT('info')
Opzione INCLUDE_NULL_VALUES
FOR JSON AUTO, INCLUDE_NULL_VALUES
[
{
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
"AccountNumber":"AW29825",
"Price":59.99,
"Quantity":1
},
{
"Number":"SO43661",
"Date":"2011-06-01T00:00:00“
"AccountNumber":"AW73565“,
"Price":24.99,
"Quantity":3
}
]
SELECT * FROM myTable
FOR JSON AUTO
17. #sqlsatParma
#sqlsat462November 28°, 2015
FOR JSON PATH
Senza FROM: singoli oggetti JSON
Con FROM: array di oggetti JSON
Ogni colonna di un record è una proprietà sul JSON
Alias con “.” come separatore per profondità
Subquery per sotto-oggetti JSON
18. #sqlsatParma
#sqlsat462November 28°, 2015
FOR JSON AUTO
Render basato su ordine di colonne/tabelle
Disponibile solo con FROM
Render immodificabile
Ogni colonna è una proprietà sul JSON
In caso di JOIN, la prima tabella è root, la seconda è nested
Subquery
21. #sqlsatParma
#sqlsat462November 28°, 2015
Funzionalità di import
TVF OPENJSON()
Consente un filtro
Sintassi JS ($.Collezione.Proprietà)
… FROM OPENJSON (@JSalestOrderDetails,
'$.OrdersArray') WITH (definition);
Caricare in tabella
Analizzare colonne
SELECT * FROM
OPENJSON(@json)
[
{
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
"AccountNumber":"AW29825",
"Price":59.99,
"Quantity":1
},…]
22. #sqlsatParma
#sqlsat462November 28°, 2015
Funzionalità di import
Validation: ISJSON( json_text )
Importante per CHECK CONSTRAINT
… WHERE (tab.JCol) > 0
Querying: JSON_VALUE( json_text, path )
Estrae uno scalare dal json letto e può filtrare per path
… AND (tab.JCol,' ') = 'C‘
Querying: JSON_QUERY( json_text, path )
Estrae un oggetto dal json letto e può filtrare per path
… AND (tab.JCol,' ') = '{…}‘ (intero JSON)
23. #sqlsatParma
#sqlsat462November 28°, 2015
Sintassi path
$ (intero JSON text), è il primo carattere di ricerca
$.prop1 (proprietà del JSON)
$[n] (ennesimo elemento nell’array JSON)
$.prop1.prop2.array1[n].prop3.array[2].prop4 (traversing)
Lax (default) e strict mode supportati
Differenza di gestione dei path non trovati (null vs error)
In caso di duplicati, viene tornata la prima occorrenza
25. #sqlsatParma
#sqlsat462November 28°, 2015
Impieghi possibili
Tabella con campi comuni + estensione JSON
Lettura informazioni di “log”
Fornitura di un formato altamente “digeribile” dalle piattaforme
Passaggio dati a Integration Services
26. #sqlsatParma
#sqlsat462November 28°, 2015
Operazioni non consigliate
Fare troppi/solo oggetti contenenti chiavi e oggetti
SQL Server è RDBMS, non Key Value Store (es: Redis)
Salvare le informazioni di continuo come JSON
Costa in termini di CPU, seppure poco (singolarmente) andare ad interpretarlo
Tutte le query con FOR JSON
JSON dovrebbe essere una utilità, non una regola
SQL non è un server creato per serializzare JSON
27. #sqlsatParma
#sqlsat462November 28°, 2015
Indicizzazione
Non è un tipo, è solo una stringa
L’indicizzazione è quella che si farebbe su campi (n)(var)char
Anche full-text
JSON_VALUE può essere usata per una colonna calcolata (+ indice)
Colonne calcolate con JSON_VALUE possono:
Essere nella chiave
Essere nell’INCLUDE
29. #sqlsatParma
#sqlsat462November 28°, 2015
Limitazioni FOR JSON
No CLR (Tranne alcuni come HIERARCHYID)
Conversione con Parser integrato
No SELECT INTO
Servono alias sempre per valori senza nome
Tabella per parsing corretto (FOR JSON AUTO)
31. #sqlsatParma
#sqlsat462November 28°, 2015
Conclusioni
Riduzione gap nei confronti di competitor (PostgreSQL)
Parser integrato ottimizzato (non preferire CLR custom)
Pochissimo t-sql aggiuntivo (parametri su funzioni)
Funzionalità in V1, molto giovane
Indicizzazione futura? Struttura dedicata su storage?
Preferire comunque, per le logiche, l’applicazione
32. #sqlsatParma
#sqlsat462November 28°, 2015
Risorse
FOR JSON PATH: https://msdn.microsoft.com/en-us/library/dn921877.aspx
FOR JSON AUTO: https://msdn.microsoft.com/en-us/library/dn921883.aspx
INCLUDE_NULL_VALUES: https://msdn.microsoft.com/en-
us/library/dn921878.aspx
ROOT: https://msdn.microsoft.com/en-us/library/dn921894.aspx
POST Jovan Popovic:
http://blogs.msdn.com/b/jocapc/archive/2015/05/16/json-support-in-sql-
server-2016.aspx
POST Aaron Bertrand: http://blogs.sqlsentry.com/aaronbertrand/sql-
server-2016-json-support/
JSON Online Viewer: http://jsonviewer.stack.hu/
JSON Online Query Tool: http://www.jsonquerytool.com/
JSON Online Tool: https://www.jsonselect.com/
Meet Stephen Hall, I have gotten to know Stephen very well in the past several months working on this project. Stephen started District Computers more than 10 years ago with the customer in mind. His company specializes in Small Business with a focus on Office365.
JSON è acronimo di JavaScript Object Notation ed è un recente formato di scambio informazioni basato su JavaScript. Tuttavia è indipendente da esso.
Recentemente ha avuto sempre più applicazioni in alternativa a XML/XSLT, essendo decisamente più di immediata gestione.
La semplicità di JSON ha consentito la sua presenza sempre più preponderante nella programmazione, soprattutto per quello che ha a che fare con AJAX.
I tipi di dato supportati sono: bool (true, false), interi, real, stringhe, array (con le []) ed array associativi (array identificati da una stringa usata come nome).
JSON è un formato ed è una stringa, non è un linguaggio di markup come invece è XML. Questo sottolinea ancora di più la sua semplicità.
Tra le cose dette fino ad ora, ci sono alcuni validi motivi per i quali utilizzare JSON. Essendo, come dicevamo, una stringa, è semplice.
Il suo punto di forza è proprio questa semplicità. Essendo poi sprovvisto di tag, non è verboso, e quindi è leggero.
E’ un formato indicato per la rappresentazione di strutture e dati, essendo in aggiunta molto leggibile ed auto documentativo.
Queste considerazioni sottolineano quanto JSON sia portabile, e, di conseguenza, interoperabile, andando di fatto a sostituire XML per la comunicazione cross platform. Infatti è uno dei più utilizzati formati di scambio informazioni presenti ad oggi. Come dicevamo prima, è utilizzato soprattutto nel mondo di AJAX e della programmazione in JavaScript con AJAX, appunto.
Tra le cose dette fino ad ora, ci sono alcuni validi motivi per i quali utilizzare JSON. Essendo, come dicevamo, una stringa, è semplice.
Il suo punto di forza è proprio questa semplicità. Essendo poi sprovvisto di tag, non è verboso, e quindi è leggero.
E’ un formato indicato per la rappresentazione di strutture e dati, essendo in aggiunta molto leggibile ed auto documentativo.
Queste considerazioni sottolineano quanto JSON sia portabile, e, di conseguenza, interoperabile, andando di fatto a sostituire XML per la comunicazione cross platform. Infatti è uno dei più utilizzati formati di scambio informazioni presenti ad oggi. Come dicevamo prima, è utilizzato soprattutto nel mondo di AJAX e della programmazione in JavaScript con AJAX, appunto.
Tra le cose dette fino ad ora, ci sono alcuni validi motivi per i quali utilizzare JSON. Essendo, come dicevamo, una stringa, è semplice.
Il suo punto di forza è proprio questa semplicità. Essendo poi sprovvisto di tag, non è verboso, e quindi è leggero.
E’ un formato indicato per la rappresentazione di strutture e dati, essendo in aggiunta molto leggibile ed auto documentativo.
Queste considerazioni sottolineano quanto JSON sia portabile, e, di conseguenza, interoperabile, andando di fatto a sostituire XML per la comunicazione cross platform. Infatti è uno dei più utilizzati formati di scambio informazioni presenti ad oggi. Come dicevamo prima, è utilizzato soprattutto nel mondo di AJAX e della programmazione in JavaScript con AJAX, appunto.