Errori frequenti con l’SQL: quali sono e come evitarli

Il linguaggio SQL ha un paradigma dichiarativo ed una radice “english-like”. Di conseguenza risulta facilmente più comprensibile di molti altri linguaggio. Anche la relativa curva di apprendimento risulta il più delle volte più ripida. Tuttavia, se non correttamente studiato, anch’esso presenta svariati trabocchetti che possono indurre anche il programmatore più esperto in errore. Vi riportiamo qui degli esempi che fanno riferimento al dialetto T-SQL sul database Microsoft Sql Server.

 

La funzione IsNull tronca le stringhe

Provate ad eseguire questo frammento di codice sul vostro database Sql Server

declare @x as varchar(1) = null;

declare @y as varchar(4)=’test’

select IsNull(@x,@y)

Probabilmente qualcuno di voi resterà come me stupito dal fatto che la query restituisce la sola lettera “t”, invece che l’intera stringa test. Infatti, l’output della funzione IsNull avrà come tipo quello del primo argomento, nel nostro esempio varchar(1). Di conseguenza la stringa test sarà convertita implicitamente in t.

Bisonga porre particolare attenzione al caso in cui il seconda argomento abbia un valore che non è convertibile nel tipo del primo argomento. Il codice seguente produrrà ad esempio un errore

declare @x as int = null;

declare @y as varchar(4)=’test’

select IsNull(@x,@y)

Ecco uno delle possibili cause quando sentite un vostro collega esclamare

“la procedura che ha sempre funzionato stanotte è fallita”

Particolarmente importante è notare che in presenza della funzione coalesce il comportamento è diverso. Il tipo della funzione coalesce coincide con il tipo del primo argomento not null.

 

Aggiornare più colonne con una sola update

Provenendo da altri linguaggio di programmazione, qualcuno potrebbe pensare che dopo questa query

update tabella

set col1 = 1,

col2=col1;

la colonna col2 sarà valorizzata con il valore 1 in tutti i record. Al contrario, gli aggiornamenti all’interno di una update non hanno un “ordine cronologico”. Col2 sarà aggiornata con il relativo valore originale di col1, riga per riga.

Ovviamente diverso invece è il caso in cui scrivo due update separate

update tabella

set col1 = 1;

update tabella

set col2=col1;

In questo caso entrambe le colonne saranno valorizzate interamente con 1.

 

Una CROSS JOIN causa un output vuoto

Molto spesso la CROSS JOIN è utilizzata quando abbiamo l’esigenza di ripetere  lo stesso identico valore su tutte le righe di una tabella. Dietro questa scelta possono esserci svariate motivazioni, ad esempio una richiesta esplicita dell’utente finale inerente la presentazione dei dati in un report, o per agevolare query di trasformazione successive. Ma cosa succede se la query utilizzata per costruire questo valore non restituisce risultati?

Se Tabella1 ha dieci record, mentre Tabella2 ha zero record la seguente query

Select         *

from          Tabella1

cross join Tabella2

restituirà zero righe. Magari il voler aggiungere una semplice colonna di supporto contenente delle informazioni margiali, potrebbe provocare un errore ben più grave: l’intero output è vuoto.

Per evitare che questo accada possiamo sostuire la cross join con una left join in questo modo

Select     *

from      Tabella1

left join Tabella2

       on 1=1

o, in modo forse più elegante, possiamo sostituire la cross join con l’outer apply

Select     *

from      Tabella1

outer apply Tabella2.

 

Errori frequenti con l’SQL: e adesso?

Occorre particolare attenzione ad utilizzare campi di tipo date e datetime all’interno di clausole Where. A questo link parliamo di come scrivere correttamente query che utilizzano colonne datetime.

Torna su