Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

[Ita] Sql Saturday 462 Parma - Sql Server 2016 JSON support

441 views

Published on

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.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

[Ita] Sql Saturday 462 Parma - Sql Server 2016 JSON support

  1. 1. #sqlsatParma #sqlsat462November 28°, 2015 SQL Server 2016: supporto nativo JSON Alessandro Alpi @suxstellino www.alessandroalpi.net http://speakerscore.com/SQL16JSON
  2. 2. #sqlsatParma #sqlsat462November 28°, 2015 Sponsors
  3. 3. #sqlsatParma #sqlsat462November 28°, 2015 Organizers getlatestversion.it
  4. 4. #sqlsatParma #sqlsat462November 28°, 2015 Alessandro Alpi | @suxstellino Blog ITA: http://blogs.dotnethell.it/suxstellino Blog ENG: http://suxstellino.wordpress.com/ Website: http://www.alessandroalpi.net www.engageitservices.it Team leader (SCRUM) Getlatestversion.it
  5. 5. #sqlsatParma #sqlsat462November 28°, 2015 Premessa Da CTP 2, ora CTP 3 Soggetto a cambiamenti Feature che devono “maturare” (V1)
  6. 6. #sqlsatParma #sqlsat462November 28°, 2015 Agenda Definizioni JSON vs XML Caratteristiche Funzionalità di export Funzionalità di import Indicizzazione Limitazioni
  7. 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 
  8. 8. #sqlsatParma #sqlsat462November 28°, 2015 JSON – Funzionalità chiave Relational data – tables Non-relational data – JSON, XML
  9. 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. 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. 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. 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. 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”
  14. 14. #sqlsatParma #sqlsat462November 28°, 2015 Integrazione con servizi esterni
  15. 15. #sqlsatParma #sqlsat462November 28°, 2015 Funzionalità FOR JSON OPENJSON ISJSON (anche DDL) JSON_VALUE (anche DDL) JSON_QUERY Denormalizzazione
  16. 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. 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. 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
  19. 19. #sqlsatParma #sqlsat462November 28°, 2015 cmd = (queryWithForJson, conn); conn.Open(); jsonResult = (); reader = cmd.ExecuteReader(); (!reader.HasRows()) jsonResult.Append( ); { reader.Read() { jsonResult.Append(reader.GetValue(0).ToString()); } } Empty JSON Append rows
  20. 20. #sqlsatParma #sqlsat462November 28°, 2015 DEMO
  21. 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. 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. 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
  24. 24. #sqlsatParma #sqlsat462November 28°, 2015 DEMO
  25. 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. 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. 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
  28. 28. #sqlsatParma #sqlsat462November 28°, 2015 Indicizzazione – esempio JSON_VALUE JSON_VALUE
  29. 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)
  30. 30. #sqlsatParma #sqlsat462November 28°, 2015 DEMO
  31. 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. 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/
  33. 33. #sqlsatParma #sqlsat462November 28°, 2015 Q&A Domande?
  34. 34. #sqlsatParma #sqlsat462November 28°, 2015 THANKS! http://speakerscore.com/SQL16JSON #sqlsatParma #sqlsat462

×