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