Riguardo al tuo ripensamento.
SQL Server 2012 introduce TRY_CONVERT
per questa esigenza. Quindi la seguente query restituirebbe NULL
piuttosto che un errore.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Non vi è alcuna garanzia nemmeno con i piani seriali che il WHERE
si verificherà prima di SELECT
viene valutato. Come spiegato in questo post del blog
da SQL Server 2005 in poi è più probabile che ciò accada rispetto alle versioni precedenti. Le Modifiche al comportamento delle funzionalità di Motore di database in SQL Server 2005
lo chiama specificamente come segue.
Ulteriori discussioni su questo comportamento si trovano in un altro buon post sul blog di Craig Freedman Errori di conversione ed aritmetici .
Nelle versioni precedenti al 2012 e TRY_CONVERT
devi avvolgere il CAST AS FLOAT
in un CASE
dichiarazione. es.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Questo non è ancora assolutamente garantito per evitare di ricevere errori come ISNUMERIC
controlla semplicemente che il valore venga eseguito il cast a uno dei tipi di dati numerici anziché in modo specifico per float Un esempio di input che non riuscirebbe è '.'
CASE
è documentato per lo più cortocircuito nei libri online (alcune eccezioni sono discusse qui
)
Puoi anche trovare ulteriori discussioni/reclami al riguardo nell'elemento di connessione SQL Server non deve generare errori illogici e un buona spiegazione di un problema simile di SQLKiwi