Проблема преобразования значений столбцов из VARCHAR (n) в DECIMAL - PullRequest
3 голосов
/ 07 апреля 2010

У меня есть база данных SQL Server 2000 со столбцом типа VARCHAR (255). Все данные являются либо NULL, либо числовыми данными с точностью до двух точек (например, «11,85»). Я попытался запустить следующий запрос T-SQL, но получил ошибку «Ошибка преобразования типа данных varchar в числовой»

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

Я попробовал более конкретное приведение, которое также не удалось.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

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

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

Я пытался конвертировать в другие типы данных, такие как FLOAT и MONEY, но только MONEY был успешным. Поэтому я попробовал следующее:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... который работал просто отлично. Есть идеи, почему исходный запрос не удался? Будет ли проблема, если я сначала переведу в ДЕНЬГИ, а затем в ДЕСЯТИЧНЫЙ?

Спасибо!

Ответы [ 3 ]

17 голосов
/ 07 апреля 2010

Вероятно, это зависит от того, является ли десятичный символ запятой или точкой. Вот некоторые тестовые запросы и их результаты:

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 гласит:

ISNUMERIC возвращает 1 при вводе выражение оценивается как действительное целое число, число с плавающей запятой, деньги или десятичный тип; в противном случае возвращается 0

Оба 3.6 и 3,6 могут быть преобразованы в money, поэтому isnumeric('3,6') возвращает 1.

Чтобы решить эту проблему, замените запятую точками (или наоборот, если ваша система использует запятую в качестве десятичного знака):

select cast(replace('3,6',',','.') as decimal)

Другой вариант - изменить «десятичный символ» в Windows. Он находится в Панели конфигурации -> Язык и региональные стандарты -> Форматы -> Дополнительные параметры -> Номера.

3 голосов
/ 12 июля 2013

Другая причина - пустые строки. Например, если вы используете мастер импорта для импорта файла CSV, пустые поля станут пустыми строками, а не пустыми.

Это общая идиома для исправления этого:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))
0 голосов
/ 07 апреля 2010

Выберите CAST (isnull (MyColumn, 0) как десятичное число (4,2)) ОТ [MyTable];

...