Ответ 1
Это будет нечисло по умолчанию для 0 и не потребует другого оператора:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
Вызов функции REPLACE() используется для изменения запятых по периодам. В некоторых культурах запятые используются как разделитель десятичных чисел (например, "1,25" вместо "1.25" ), но если ваш сервер не настроен с одной из них в качестве культуры по умолчанию, ISNUMERIC() вернет 1, но CONVERT ( ) выдает ошибку. Это означает, что ваши строки не должны использовать запятые в качестве разделителей тысяч, но в большинстве случаев запятая для десятичного заполнителя скорее всего будет десятичным заполнителем.
Вызов LTRIM (RTRIM()) заключается в том, что ISNUMERIC() возвращает 1 для строки с ведущими или конечными пробелами, но CONVERT() не может с ними справиться. Итак, вы должны обрезать свои строки.
Единственная оставшаяся потенциальная проблема заключается в том, что ISNUMERIC() вернет 1, если число может быть представлено как int, currency, decimal или float, но вы только конвертируете в float. Реально, float может хранить практически все, что вы бросаете на него, но если вы пытались преобразовать в int вместо этого, ISNUMERIC() вернет 1 для значения типа "2.5", но CONVERT (int, "2.5" ) будет все равно выдайте ошибку.