Проблема Преобразование значений столбцов из varchar (n) до десятичных

StackOverflow https://stackoverflow.com/questions/2589103

Вопрос

У меня есть база данных 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];

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top