Em relação ao seu pensamento posterior.
O SQL Server 2012 apresenta
TRY_CONVERT
para esta necessidade. Portanto, a consulta a seguir retornaria NULL
ao invés de um erro. SELECT TRY_CONVERT ( FLOAT, 'Fish')
Não há garantia, mesmo com planos seriais, de que o
WHERE
cláusula acontecerá antes do SELECT
é avaliado. Conforme explicado nesta postagem do blog
a partir do SQL Server 2005 é mais provável que isso aconteça do que nas versões anteriores. As Mudanças de comportamento nos recursos do mecanismo de banco de dados no SQL Servidor 2005
especificamente chama isso da seguinte forma. Mais discussão sobre esse comportamento está em outra boa postagem no blog de Craig Freedman Erros de conversão e aritméticos .
Em versões anteriores a 2012 e
TRY_CONVERT
você precisa envolver o CAST AS FLOAT
em um CASE
declaração. por exemplo. SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Isso ainda não é absolutamente garantido para evitar erros como
ISNUMERIC
apenas verifica se o valor seria convertido em um dos tipos de dados numéricos em vez de flutuar especificamente Um exemplo de uma entrada que falharia é '.'
CASE
está documentado principalmente em curto-circuito em livros on-line (algumas exceções são discutidas aqui
) Você também pode encontrar discussões/reclamações adicionais sobre isso no item de conexão SQL Server não deve gerar erros ilógicos e um boa explicação de um problema semelhante por SQLKiwi