2014-09-15 8 views
1

Только теперь я получаю эту ошибку при выполнении хранимой процедуры:Ошибка арифметического переполнения преобразования varchar в тип данных числовой?

Arithmetic overflow error converting varchar to data type numeric. 

Я нашел строку, в которой эта ошибка была откуда и это код на этой линии:

SELECT @AF_MIN_3L = LEFT(MIN([A-F Est_CY]), 6) - 0.000001 FROM #Ent_AF_3 

Ранее в хранимую процедуру, я объявил @ AF_MIN_3L как тип данных FLOAT, создал временную таблицу # Ent_AF_3 и при этом сделал столбец [AF Est_CY] тип данных FLOAT. Является ли следующий код созданием значения, отличного от FLOAT?

LEFT(MIN([A-F Est_CY]), 6) - 0.000001 

Я надеюсь, что это простой вопрос, литье и все, что я должен сделать что-то вроде этого:

LEFT(MIN(CAST([A-F Est_CY] AS FLOAT)), 6) - CAST(0.000001 AS FLOAT) 

Я не хочу, чтобы запустить всю процедуру снова, не будучи уверенным, что я исправил проблему , Спасибо за любую помощь.

+0

Я думаю, что вам нужно, чтобы бросить его обратно плыть перед вычитанием: 'ВЫБРАТЬ @ AF_MIN_3L = CAST (LEFT (MIN ([AF Est_CY]), 6) AS поплавка) - 0,000001 FROM # Ent_AF_3', но я думаю, это зависит от того, что вы на самом деле хотите достичь. – jpw

+0

Кажется, что ваши операции вышли из строя - не должно быть 'MIN (CAST (LEFT ([A-F Est_CY], 6) AS FLOAT))'? Возьмите левые 6 символов, конвертируйте их в float и найдите минимум? –

+0

Какова ваша цель, например. 'select @ a = -0.00001' приводит к' select @ a'> '-1E-05' и' select LEFT (@a, 6) '>' -1e-00' – bummi

ответ

1

Если вы используете строковую функцию, что такое LEFT, она восстанавливает строковое значение. Как описано here, возвращаемый тип данных функции LEFT действительно возвращает VARCHAR или NVARCHAR. Итак, ideed, a CAST или CONVERT назад, чтобы FLOAT не требуется. Вы должны, конечно, конвертировать обратно в FLOAT ПОСЛЕ функции LEFT, поэтому это будет: CAST (LEFT (...) как FLOAT).

+0

Это отлично поработало, спасибо. 'CAST (LEFT (MIN ([A-F Est_CY]), 6) AS FLOAT) - 0,000001 * стерла ошибку. – ultimate8

+0

@ ultimate8 'Declare @a float select @ a = -0.00001 выбрать CAST (LEFT (@a, 6) AS FLOAT) - 0.000001' приведет к' -1 000001', я не думаю, что это то, что вы хотели бы получить? – bummi

0

Проблема заключается в вашей точности - если у вас есть float> 0.999999 в файле temp, вы получите ошибку из-за неявного преобразования.

Использование:

SELECT CAST(LEFT(MIN([A-F Est_CY]), 6) AS float) - 0.000001 FROM #Ent_AF_4 
+0

Не видел этого до тех пор, пока я не запустил свою процедуру, но это именно то, что я делал. Он бежал без ошибок, поэтому спасибо. – ultimate8

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

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