2010-12-28 2 views
4

У меня есть столбец данных, который содержит 9 цифр числовых значений, но столбец определяется как varchar. Мне нужно CAST поле к числовому значению, поэтому я могу разделить сумму столбца на 100. Например,SQL Server CAST из varchar в числовой сбой с ошибкой

select CAST(field1 as numeric(9,2))/100 from table; 

я получаю следующее сообщение об ошибке при выполнении запроса: Ошибка арифметического переполнения преобразования VARCHAR к типу данных числового.

Если я выполняю двойной CAST из varchar -> int -> numeric, работает CAST. например

select CAST(CAST(field1 as int) as numeric(9,2))/100 from table; 

Есть ли причина, почему одного CAST от VARCHAR -> Числовые приводит к ошибке SQL, но работы двойные CAST?

+0

Что такое ** значение ** вашего 'field1', которое вы пытаетесь преобразовать? NUMERIC (9,2) будет иметь только 7 цифр до десятичной точки - так что ничего больше 10 миллионов ** будет ** вызывать числовое переполнение .... –

+0

Большинство значений в поле 0000xxxxx, где есть 3 -4 ведущие ноль. В CAST нет десятичных значений в поле. –

ответ

6

Если ваше поле содержит 9 цифр, оно может быть не более 999,999,999. Моя первоначальная мысль была, что ваш бросок должен быть CAST (NUMERIC 11, 2)

редактировать

Чтобы быть на безопасной стороне, с 9 длиной символов, вы можете иметь цифры от 999,999,999 до 0.1234567. Это означает, что вам нужно 9 цифр до десятичной точки и 7 после (всего 16). Поэтому ваш бросок должен быть CAST (NUMERIC (16,7)

select CAST(field1 as numeric(16,7) from table;

+0

Не повезло с расширением длины поля до (11,2). Я все еще получаю ошибку арифметического переполнения. –

+0

@Dan Iverson - ответ отредактировал –

+0

Я только что видел значения поля exaneded, не повезло с числовым (19,8). –

2

Причиной ошибки была одна строка, которая была «-» в качестве значения для поля. CASTing непосредственно в NUMERIC не работает, но CASTing to INT сначала принудительно возвращает поля «-» 0.

+0

Мы нашли эту статью полезной (после факта) http://msdn.microsoft.com/en-us/library/ms186272.aspx Мы попытались использовать функцию isNumeric() для проверки наших данных, но знак минус, '- ', возвращает ложное срабатывание. –

+0

Спасибо за подсказку относительно символа '-'. Это помогло мне решить подобную проблему. – Blackvault

Смежные вопросы