Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

impossible de convertir la valeur en float

Concernant votre réflexion après coup.

SQL Server 2012 introduit TRY_CONVERT pour ce besoin. Ainsi, la requête suivante renverrait NULL plutôt qu'une erreur.

SELECT TRY_CONVERT ( FLOAT, 'Fish')

Il n'y a aucune garantie, même avec des plans en série, que le WHERE la clause se produira avant le SELECT est évalué. Comme expliqué dans cet article de blog à partir de SQL Server 2005, cela est plus susceptible de se produire que dans les versions précédentes. Modifications de comportement des fonctionnalités du moteur de base de données dans SQL Serveur 2005 l'appelle spécifiquement comme suit.

Plus de discussion sur ce comportement est dans un autre bon article de blog par Craig Freedman Erreurs de conversion et d'arithmétique .

Sur les versions antérieures à 2012 et TRY_CONVERT vous devez envelopper le CAST AS FLOAT dans un CASE déclaration. ex.

  SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
  FROM Table
  WHERE ISNUMERIC(Col)=1

Cela n'est toujours pas absolument garanti pour vous empêcher d'obtenir des erreurs comme ISNUMERIC lui-même vérifie simplement que la valeur serait convertie en l'un des types de données numériques plutôt que spécifiquement pour flotter Un exemple d'entrée qui échouerait est '.'

CASE est documenté pour la plupart du temps court-circuit dans les livres en ligne (certaines exceptions sont discutées ici )

Vous pouvez également trouver des discussions/réclamations supplémentaires à ce sujet dans l'élément de connexion SQL Server ne doit pas générer d'erreurs illogiques et un bonne explication d'un problème similaire par SQLKiwi