Ce sera par défaut non-numerics à 0 et ne nécessitera pas une autre déclaration:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
L'appel de fonction REPLACE() est utilisée pour changer des virgules pour les périodes. Les virgules sont utilisées dans certaines cultures comme un séparateur décimal (par exemple, «1,25» au lieu de «1,25»), mais à moins que votre serveur ne soit configuré avec l'une de ces valeurs par défaut, ISNUMERIC() renvoie 1 mais CONVERT () va lancer une erreur. Cette signifie que vos chaînes ne doivent pas utiliser de virgules comme des séparateurs de milliers, mais dans la plupart des cas, une virgule pour un espace réservé décimal est plus susceptible d'être un espace réservé décimal. L'appel LTRIM (RTRIM()) est parce que ISNUMERIC() retournera 1 pour une chaîne avec des espaces de début ou de fin, mais CONVERT() ne peut pas traiter avec eux. Donc, vous devez couper vos cordes. Le seul problème potentiel restant est que ISNUMERIC() renvoie 1 si le nombre peut être représenté comme int, currency, decimal ou float, mais que vous convertissez uniquement en float. De manière réaliste, un flottant peut stocker à peu près tout ce que vous lui lancez, mais si vous essayez de convertir en un int à la place, ISNUMERIC() retournera 1 pour une valeur comme "2.5", mais CONVERT (int, '2.5') encore jeter une erreur.
TRY CATCH ne rentre pas dans ma solution car je suis limité et je ne peux pas ajouter d'instructions supplémentaires. J'envisage d'ajouter une fonction supplémentaire qui fera du casting en toute sécurité.Quelque chose comme, "myconvert (type, données, valeur par défaut)", je me demande s'il existe un autre moyen qui me libérerait de l'ajout de fonction personnalisée dans la base de données. – AndrewG
+1 pour TRY..CATCH - c'est vraiment le chemin à parcourir! –
"SELECT CASE" dans la réponse ci-dessous est mieux et plus flexible que TRY ... CATCH. – TamusJRoyce