Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

incapaz de converter valor como float


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