Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Msg 3623, An invalid floating point operation occurred.  [new]
madbsdnix
Member

Откуда:
Сообщений: 2
Столкнулся с "траблом" и еже уперся не решается, все что гугл подсказывает и не совсем подходит....
Вот текст запроса. Вернее его модификация из функции что вполне работала у меня на старой версии MS SQL 9.0.5069. На версии 13.0.4001 валится в ошибку...
DECLARE @transactionstatus INT
SET @transactionstatus=2074120

DECLARE @CurBit INT
DECLARE @ResStr VARCHAR(MAX)
DECLARE @OLD_transactionstatus INT
SET @OLD_transactionstatus=@transactionstatus

SET @ResStr=''

WHILE @transactionstatus>=0 
BEGIN
	SET @CurBit = floor(LOG(@transactionstatus)/LOG(2)) --- Валится тут (Суть получить целую часть от числа)
	SET @ResStr = @ResStr + convert(varchar,@CurBit)+' {'+
				CASE
                        WHEN @CurBit=21 THEN 'State 21'
			WHEN @CurBit=20 THEN 'State 20'
			WHEN @CurBit=19 THEN 'State 19'
			WHEN @CurBit=18 THEN 'State 18'
			WHEN @CurBit=17 THEN 'FiscalPrintByTimeOut'
			WHEN @CurBit=16 THEN 'ComitGetBonuses'
			WHEN @CurBit=15 THEN 'FuellingFinished'
			WHEN @CurBit=14 THEN 'ComitPayment'
			WHEN @CurBit=13 THEN 'FiscalPrinted'
			WHEN @CurBit=12 THEN 'FuellingStarted'
			WHEN @CurBit=11 THEN 'CheckPrintedFromCancel'
			WHEN @CurBit=10 THEN 'CheckPrinted'
			WHEN @CurBit=9 THEN 'DomsTransactionSetuped'
			WHEN @CurBit=5 THEN 'CompanyCardTrandMade'
			WHEN @CurBit=4 THEN 'MOneyOKPressed'
			WHEN @CurBit=3 THEN 'MoneyStacked'
			WHEN @CurBit=2 THEN 'State 2'
			WHEN @CurBit=1 THEN 'State 1'
			WHEN @CurBit=0 THEN 'StandBy'
			ELSE 'NAN'
		END +'} '
	SET @transactionstatus = @transactionstatus - POWER(2,@CurBit)
END

	SELECT convert(varchar,@OLD_transactionstatus)+' => '+ @ResStr



При этом священный и могучий гугл говорит отваришь у тебя расчет скорее всего не возможен...
Делаю проверку...

DECLARE @transactionstatus INT
SET @transactionstatus=2074120
SELECT floor(LOG(@transactionstatus)/LOG(2))

И вуаля результат 20 как и должно быть.

Уже закипаю... Что не так???? Народ подскажите. Замена на REAL или NUMERIC переменных не помогает. Числа получаются INT.
Хотя результат floor NUMERIC.
27 июл 17, 02:50    [20678376]     Ответить | Цитировать Сообщить модератору
 Re: Msg 3623, An invalid floating point operation occurred.  [new]
aleks222
Guest
1. LOG ( float_expression [, base ] )
т.е. LOG(@transactionstatus)/LOG(2)) = LOG(@transactionstatus), 2)

2. Если показывает на ЭТУ строку - выведите значение

select @transactionstatus;
SET @CurBit = floor(LOG(@transactionstatus)/LOG(2)) --- Валится тут (Суть получить целую часть от числа)

и узрите воотчуюю.

Потому как в вашей логике получить @transactionstatus < 0 - как нефиг делать.
27 июл 17, 05:13    [20678407]     Ответить | Цитировать Сообщить модератору
 Re: Msg 3623, An invalid floating point operation occurred.  [new]
aleks222
Guest
Ах да, просмотрел

WHILE @transactionstatus>=0
BEGIN
SET @CurBit = floor(LOG(@transactionstatus)/LOG(2))

Вы, надеюсь, в курсе чему равен LOG(0)?
27 июл 17, 05:42    [20678412]     Ответить | Цитировать Сообщить модератору
 Re: Msg 3623, An invalid floating point operation occurred.  [new]
madbsdnix
Member

Откуда:
Сообщений: 2
Только проснулся...
Вашу ж за нагу .... Вот что значит по ночам писать.... Спасибо вкурил...
Вот лошара с дипломом. А работал бы debug отловил бы что ошибка происходит в процессе цикла. А не при первой же итерации...

Вот я нюб... Спасибо..
27 июл 17, 09:36    [20678679]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить