Проблема Преобразование значений столбцов из varchar (n) до десятичных
-
25-09-2019 - |
Вопрос
У меня есть база данных SQL Server 2000 с столбцом типа Varchar (255). Все данные либо нулевые, либо числовые данные до двух точек точности (например, '11 .85 '). Я пытался запустить следующие запросы T-SQL, но получил ошибку «Ошибка преобразования данных Varchar в числовой»
SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];
Я попробовал более специфический актерский состав, который также не удалось.
SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];
Я также попробовал следующее, чтобы увидеть, если какие-либо данные не являются числовыми, и только возвращенные значения были нулевыми.
SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;
Я пытался преобразовать в другие типы данных, такие как поплавка и деньги, но только деньги прошли успешно. Поэтому я попробовал следующее:
SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];
... который работал просто хорошо. Любые идеи, почему первоначальный запрос не удался? Будет ли проблема, если я впервые преобразую деньги, а затем до десятичных?
Спасибо!
Решение
Вероятно, это зависит от того, является ли десятичный символ запятой или точкой. Вот несколько тестовых запросов и их результаты:
select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1
Документация для Isnumeric. говорит:
ISNUMIC возвращается 1, когда входное выражение оценивает допустимое целое число, номер с плавающей запятой, денег или десятичным типом; в противном случае он возвращает 0
Обе 3.6
а также 3,6
можно отдать money
, так вот почему isnumeric('3,6')
возвращается 1
.
Чтобы решить эту проблему, замените запятую с точками (или наоборот, если ваша система использует запятую в качестве десятичного символа):
select cast(replace('3,6',',','.') as decimal)
Другой вариант - изменить «десятичный символ» в Windows. Это в конфигурации панели -> региональные и языковые -> форматы -> Дополнительные настройки -> номера.
Другие советы
Другая причина - пустые строки. Например, если вы используете мастер импорта для импорта файла CSV, пустые поля станут пустыми строками, а не NULLS.
Это обычная идиома для исправления этого:
CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))
Выберите ряд (isnull (mycolumn, 0) как десятичные (4,2)) из [mytable];