TSQL: convertire un numero in esadecimale


Alle volte c'è la necessità di convertire un numero in esadecimale direttamente dalla fonte dati per generare dei codici colore da usare direttamente su una pagina web. L'altro giorno ho avuto l'esigenza di generare dei codici colore direttamente dalla fonte dati, per comodità e prestazioni. La fonte dati era composta da un grosso numero di dati e dovevo generare dei gradienti di colore per rappresentare dei dati in maniera visuale su delle mappe.

Per fare questa cosa ho normalizzato i miei numeri in una scala da 0 a 255 in modo da poterlo convertire facilmente in un codice colore HTML e metterlo direttamente in pagina. Per poter fare questo occorre poter trasformare i numeri dalla base decimale a quella esadecimale, in quanto in HTML i codici colori sono scritti come come una tripletta di numeri esadecimali.

Ad esempio il rosso viene scritto con il seguente codice #FF0000. In html i colori vengono espressi come combinazione delle tre componenti fondamentali, il rosso, il verde e il blu, conosciuta anche come RGB o tricromia. Quindi nell'esempio precedente i primi due caratteri dopo il # (cancelletto) rappresentano il valore della componente rossa (FF ovvero 255, valore massimo), mentre i secondi due caratteri rappresentano la componente verde (00 ovvero 0, valore minimo) ed infine i terzi due caratteri rappresentano la componente blu (00 ovvero 0, valore minimo).

Quindi il nostro problema è di prendere un numero è di convertirlo in una stringa esadecimale. Per fare questo possiamo utilizzare in TSQL (l'sql di SQL Server) una funzione non documentata che si chiama sys.fn_varbintohexstr. Questa funzione prende in input un numero e restituisce in output una stringa con la sua rappresentazione esadecimale.

Ad esempio se eseguo questa SQL

SELECT sys.fn_varbintohexstr(255)

Ottengo come risultato 0x000000ff.

Nel nostro caso specifico, ci serve un numero esadecimale a due cifre e quindi dobbiamo prendere gli ultimi due caratteri di questa stringa.

SELECT RIGHT(sys.fn_varbintohexstr(@Numero),2)

dove @Numero sarà il numero da 0 a 255 che vogliamo convertire.

In conclusione se voglio rappresentare un mio dato (come abbiamo detto già normalizzato in un valore da 0 a 255) con un gradiente di colore rosso, quello che dovrò scrivere è 

SELECT '#' + RIGHT(sys.fn_varbintohexstr(@NumeroNormalizzato),2)  + '0000'

In questo modo otterrò un codice colore HTML dipendente dal dato che voglio visualizzare.

Happy coding. :-)


Post correlati: