Используйте TRY_CONVERT
для очистки ошибочных записей:
SELECT *
FROM [RAW_XXX]
WHERE TRY_CONVERT(FLOAT, Balance) IS NULL;
Проблема с вашей текущей логикой заключается в том, что что-то вроде $123.45
будет истинным в соответствии с ISNUMERIC
, но потерпит неудачу при попыткев качестве числа с плавающей точкой.
Кстати, если вам нужен более простой способ поиска записей, не подлежащих разглашению, вы можете просто положиться на LIKE
:
SELECT *
FROM [RAW_XXX]
WHERE Balance NOT LIKE '%[^0-9.]%' AND Balance NOT LIKE '%.%.%';
первое условие LIKE
гарантирует, что Balance
состоит только из цифр и десятичных точек, а второе условие гарантирует, что появляется не более одной десятичной точки. Проверьте демонстрацию ниже, чтобы увидеть это работает.
Демо