T-Sql

Rigenerare colonne IDENTITY in SQL Server e Azure SQL!

Recentemente mi sono imbattuto nell’errore SQL 8115:

Arithmetic overflow error converting IDENTITY to data type int.

Un errore di overflow su una colonna IDENTITY si verifica ogni volta che proviamo a inserire in una colonna un valore superiore al limite previsto per il tipo di dato. Nel caso che ho seguito si trattava di una colonna di tipo integer con proprietà IDENTITY(1, 1), valorizzata automaticamente da SQL Server ad ogni inserimento di dati. L’overflow può avvenire su colonne di tipo integer (come in questo caso) ma anche su colonne di tipo tinyint, smallint e bigint.

Aggiornamento statistiche SQL per database che contengono External Table PolyBase

Sergio Govoni

Recentemente, ho avuto l’occasione di configurare un piano di manutenzione database per un DB in cui sono state create alcune External Table PolyBase che permettono di raggiungere dati archiviati all’esterno dell’istanza SQL Server.

Non si poteva testare la manutenzione database contestualmente alla configurazione del piano e così ho atteso la finestra temporale dedicata a queste attività. All’ora indicata, il piano di manutenzione (configurazione classica) non è stato eseguito correttamente, le verifiche hanno successivamente rilevato un errore nel task di aggiornamento statistiche.

Come reimpostare i valori della colonna Identity per tutte le tabelle di un database SQL Server

Recentemente ho avuto la necessità di dover effettuare il reseed a 1 dei valori di tutte le colonne Identity delle tabelle vuote di un database.

Scomponendo la richiesta in task più piccoli si sono individuati i seguenti due task:

  1. Individuare le tabelle senza record nel database
  2. Effettuare il reseed dell’unica colonna IDENTITY generando uno script con i comandi incapsulando il codice all’interno di una stored procedure

Per individuare le tabelle prive di righe può essere utilizzata la CTE spaceused sviluppata nell’articolo:

Unit testing: Come scrivere la tua prima unit test!

Sergio Govoni

Nell’articolo precedente, il secondo di questa serie, abbiamo descritto come installare il framework tSQLt, il tool SQL Test di Red-Gate e come avviene l’esecuzione di una unit di test. Ora è giunto il momento di scrivere il nostro primo test! Useremo gli strumenti che abbiamo descritto in precedenza!

Specifiche e requisiti

Scriveremo la nostra prima unit di test per verificare i requisiti di un trigger che ci è stato commissionato dall’Azienda inventata Adventure Works LTD il cui database è disponibile per il download su questo repository di GitHub. Il database AdventureWorks2017 contiene la tabella Product riferita allo schema Production. La tabella Product rappresenta l’anagrafica dei prodotti gestiti e commercializzati dall’Azienda che vi ha commissionato un trigger per impedire l’inserimento di nuovi prodotti aventi come “scorta di sicurezza” valori minori di 10. L’Azienda desidera quindi avere sempre una scorta di magazzino pari a 10 unità. La scorta di sicurezza è un dato molto importante per le procedure automatiche di riordino dei materiali, che ne tengono conto per l’emissione degli ordini a fornitore o degli ordini di produzione. Per semplificare l’esempio, il trigger risponderà soltanto all’evento OnInsert, per i comandi INSERT.

Barcode check digit calculator for SQL Server and Azure SQL DB

Chi ha avuto l’opportunità di sviluppare applicazioni per trasportare i prodotti da un luogo ad un altro, ha appreso che per gestire in modo efficiente la movimentazione delle merci all’interno di un magazzino è necessario adottare un sistema di movimentazione basato su codici a barre.

Il codice a barre è la rappresentazione grafica di una sequenza di numeri e altri simboli. La rappresentazione consiste di linee (barre) e spazi. Un codice a barre è tipicamente composto da cinque parti, una di queste è la cifra di controllo, nota anche come check digit. L’algoritmo di calcolo della cifra di controllo è descritto in questa pagina del sito di GS1, l’associazione internazionale che si occupa di diffondere gli standard progettati per migliorare l’efficienza della filiera domanda-offerta, tra questi c’è anche lo standard relativo ai codici a barre. In questo articolo abbiamo descritto una possibile implementazione dell’algoritmo di calcolo della cifra di controllo in TSQL, in quell’occasione abbiamo trattato il calcolo del check digit per un barcode EAN13. Recentemente, ho avuto l’occasione di migliorare la soluzione implementando le funzioni mancanti che permettono di calcolare il check digit per i seguenti tipi di barcode:

sp_alter_column - La stored procedure per modificare una colonna!

Sergio Govoni

Introduzione

Sarà successo anche a voi di dover modificare il tipo di dato di una colonna presente da tempo in una tabella di un database SQL Server e probabilmente vi sarete scontrati con l’errore 5074 che segnala l’impossibilità di modificare la colonna a causa della presenza di oggetti collegati come Primary Key, Foreign Key, Indici, Vincoli (di univocità e non), Statistiche, ecc..

Ecco un esempio dell’errore 5074:

Msg 5074, Level 16, State 1, Line 1135 - The object 'objectname' is dependent on column 'Columnname'.

String or Binary data would be truncated: replacing the infamous error 8152 ... also in SQL Server 2017

Pasquale Ceglie

Come già annunciato allo scorso Ignite, una delle nuove (tra le tante) feature di SQL Server 2019 accolta con ovazione dei presenti è la possibilità di ottenere informazioni più complete rispetto al tanto odiato messaggio

La buona notizia è che è possibile abilitare la stessa funzionalità anche su SQL Server 2017 (e con la SP2 su SQL Server 2016) installando la CU12 e abilitando trace flag 460.

Qui trovate tutti i dettagli.

Statistiche di utilizzo e performance delle viste in un database SQL Server

Sergio Govoni

Le performance di una soluzione database sono spesso oggetto di diatriba tra chi fornisce la soluzione e chi la personalizza. Scrivere codice T-SQL ottimizzato, in grado di scalare all’aumentare dei dati e degli utenti, non è affatto semplice e quando la complessità aumenta, le attività di manutenzione del codice diventano difficili da attuare anche per l’autore stesso.

In questo articolo, condivido la metodologia di tuning e alcuni script che utilizzo per ottenere informazioni sulle performance delle query che utilizzano le viste presenti nel database oggetto dell’analisi. La presenza di viste nidificate contenenti query non ottimizzate può diventare oggetto di analisi specifica, gli script contenuti in questo articolo hanno l’obiettivo di fornire alcuni indicatori sull’utilizzo e sulle performance delle viste di un DB.

PASSGIVC - TSQL Advanced for Grouping and Windowing

Il prossimo webinar del PASS Italian Virtual Chapter è programmato per mercoledì 21 marzo 2018 alle ore 18:00.

Andrea Martorana Tusa (@bruco441) ci spiegherà come utilizzare il linguaggio T-SQL in modo avanzato per effettuare operazioni di grouping e utilizzare le funzioni di windowing, nel webinar dal titolo “T-SQL advanced: Grouping and Windowing”.

Questo è l’abstract:

Lo scopo di questa sessione è esplorare le possibilità offerte del linguaggio T-SQL in termini di aggregazione e calcolo dei dati. C’è molto di più della sola clausola GROUP BY! Con le funzioni di aggregazione e di ranking, si possono calcolare direttamente nella stessa query, totali parziali, totali complessivi, si possono trovare intervalli in serie, selezionare l’ultimo valore non-null, ecc. Le funzioni di windowing si applicano invece ad un set di righe delimitato dalla clausola OVER (una “window” appunto). Le funzioni di windowing non effettuano l’aggregazione del gruppo a livello di riga e non nascondono i dettagli. Così è possibile mostrare dei dati di dettaglio e dei totali nella stessa query. La sessione è basata principalmente su un copioso numero di demo, che consentiranno di esplicitare al meglio i concetti introdotti. Per ogni soluzione, verrà anche valutato l’impatto in termini di performance.

Esempi di SQL Graph Database su GitHub

SQL Server offre da sempre gli strumenti per gestire i dati gerarchici e le relazioni tra le entità. A volte, però, le relazioni tra le entità possono diventare complesse. Pensiamo ad una relazione molti-a-molti, i database relazionali non dispongono di soluzioni native per questo tipo di legame, che viene comunemente implementato con una tabella di associazione.

SQL Server 2017, grazie all’introduzione di Graph Database, permette di esprimere certi tipi di query più facilmente rispetto ad un database relazionale puro.