Ошибка кода SQL при преобразовании типа данных varchar в число с плавающей точкой - PullRequest
1 голос
/ 14 октября 2019

Следующий код обнаруживает ошибку при выполнении в Microsoft Server Management Studion:

USE [DST]
GO

Select 
  CAST([Balance] as float)
FROM [RAW_XXX] 
WHERE ISNUMERIC(Balance) = 1

Сообщение 8114, уровень 16, состояние 5, строка 2 Ошибка преобразования типа данных varchar в число с плавающей запятой.

Я думал, что ISNUMERIC исключит все, что не может быть преобразовано или преобразовано.

Это огромная база данных в SQLServer 2012, поэтому я не уверен, как найти данные, которыевызывая ошибку.

1 Ответ

1 голос
/ 14 октября 2019

Используйте 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 состоит только из цифр и десятичных точек, а второе условие гарантирует, что появляется не более одной десятичной точки. Проверьте демонстрацию ниже, чтобы увидеть это работает.

Демо

...