Firebird è un DBMS abbastanza potente ma soprattutto leggero e versatile. Esso, però, presenta alcune limitazioni di non poco conto. Una su tutte è l'impossibilità di convertire un campo varchar(n) in smallint, nonostante tutti i record che si riferiscono al campo in questione siano degli interi positivi di una sola cifra.
Per intenderci, al primo tentativo di conversione mi sono beccato un errore del tipo:
Conversion error from string
Cosa fare dunque? Nelle FAQ di Firebird esiste una procedura, ma sinceramente ho preferito fare di testa mia. Per prima cosa ho creato un nuovo campo nella tabella di interesse, mediante la seguente query:
ALTER TABLE nometabella ADD nuovocampo SMALLINT;
A questo punto ho copiato il contenuto del campo varchar(n) all'interno del campo appena creato:
UPDATE nometabella SET nuovocampo = vecchiocampo;
Ho quindi modificato la posizione di nuovocampo, portandolo a fianco di vecchiocampo:
ALTER TABLE nometabella ALTER COLUMN nuovocampo POSIZION x
dove x è, ovviamente, la nuova posizione.
Per maggiore sicurezza, ho provveduto a lanciare una query di verifica, in modo da identificare eventuali discrepanze tra il contenuto di nuovocampo e quello di vecchiocampo:
SELECT * FROM nometabella WHERE nuovocampo <> vecchiocampo
Poichè la suddetta query ha restituito come risultato 0 record, mi sono tranquillizzato ed ho eseguito la query:
ALTER TABLE nometabella ALTER COLUMN vecchiocampo TO vecchiocampo_bak
e quindi:
ALTER TABLE nometabella ALTER COLUMN nuovocampo TO vecchiocampo
In soldoni, non ho fatto altro che rinominare nuovocampo in vecchiocampo, ereditando quindi il tipo di dato (smallint).
Infine, ho eliminato vecchiocampo_bak:
ALTER TABLE nometabella DROP COLUMN vecchiocampo_bak
Semplice, no?
Alla prossima.