Звучит так, потому что у вас есть числовые данные, хранящиеся в столбце строки, у вас плохие данные. Один из способов определить это:
SELECT key_column, ORIGBAL
FROM dbo.tablename
WHERE ORIGBAL LIKE '%[^-.0-9]%';
Фикс, что данные (они могут содержать запятые, но, вероятно, повреждение хуже, чем, например, некоторые значения с полностью нечисловом данными - в противном случае, отданных в MONEY
должны работали) , Если вы обнаружите, что много строк содержат запятые, вы можете просто запустить обновление:
UPDATE dbo.tablename SET ORIGBAL = REPLACE(ORIGBAL, ',', '');
Затем выполните вышеуказанный запрос еще раз. Если строки не возвращаются, теперь вы можете преобразовать в «нормальные» числовые типы вместо MONEY
или FLOAT
, которые действительно должны быть зарезервированы для очень специфических сценариев ИМХО.
Без фиксации данных, вы можете сделать вашу жизнь более сложной, используя выражение CASE
во всех ваших запросах:
SELECT key_column, CONVERT(DECIMAL(12,2), CASE
WHEN ORIGBAL LIKE '%[^-.0-9]%' THEN ORIGBAL END
FROM dbo.tablename
...
Это даст NULL
значения вместо плохих, не-числовых значений. Однако он все равно может выйти из строя, например. это выражение будет передано для 0.0.0.44.02
, которое, очевидно, не может быть преобразовано в десятичную. В качестве примера:
DECLARE @x TABLE(ORIGBAL NVARCHAR(255));
INSERT @x VALUES('bob'),('0.0.0.44.02'),('32500.40');
SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%'
THEN 'needs correcting' ELSE 'all good' END
FROM @x;
Результаты:
bob needs correcting
0.0.0.44.02 all good
32500.40 all good
Для выявления случаев с несколькими десятичными точками, вы можете сделать:
SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%'
OR LEN(ORIGBAL)-LEN(REPLACE(ORIGBAL,'.','')) > 1
THEN 'needs correcting' ELSE 'all good' END
FROM @x;
Результаты:
bob needs correcting
0.0.0.44.02 needs correcting
32500.40 all good
Вы все еще могут иметь значения, которые превышают возможные конвертировать, например. '123456789.56'
слишком большой для DECIMAL(12,2)
.
В SQL Server 2012, вы будете иметь сокращенную для приведенного выше выражения:
SELECT key_column, TRY_CONVERT(DECIMAL(12,2), ORIGBAL)
FROM dbo.tablename
...
... который будет выход NULL
значения даже для более сложных значений, как 0.0.0.44.02
.
Вы можете показать примеры некоторых данных, которые вы пытаетесь конвертировать? –