Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Прошу прощения за текст запроса, это то что я извлек из профайлера, запрос к базе 1С:
exec sp_executesql N'SELECT
T1.Q_001_F_000RRef,
T1.Q_001_F_001_,
T1.Q_001_F_002_,
CAST(CASE WHEN (T1.Q_001_F_001_ > T1.Q_001_F_002_) THEN (((CAST(T1.Q_001_F_001_ AS NUMERIC(18, 8)) / T1.Q_001_F_002_) - 1.0) * 100.0) ELSE (CAST(((CAST(T1.Q_001_F_002_ AS NUMERIC(37, 8)) / T1.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0) END AS NUMERIC(15, 2))

FROM (SELECT
            T3._IDRRef AS Q_001_F_000RRef,
            T3._Fld2071 AS Q_001_F_001_,
            CAST(SUM(((T2._Fld1866 + T2._Fld1969) * T2._Fld2675)) AS NUMERIC(37, 8)) AS Q_001_F_002_

          FROM _Document1823_VT1852 T2 WITH(NOLOCK)
            LEFT OUTER JOIN _Document1823 T3 WITH(NOLOCK)
                ON T2._Document1823_IDRRef = T3._IDRRef

          WHERE (T3._Fld2071 > @P1)

          GROUP BY T3._IDRRef,
             T3._Fld2071

          HAVING ((CAST(SUM(((T2._Fld1866 + T2._Fld1969) * T2._Fld2675)) AS NUMERIC(37, 8)) > @P1) AND (CAST(SUM(((T2._Fld1866 + T2._Fld1969) * T2._Fld2675)) AS NUMERIC(37, 8)) <> T3._Fld2071))) T1

/*WHERE (CAST(CASE WHEN (T1.Q_001_F_001_ > T1.Q_001_F_002_) THEN (((CAST(T1.Q_001_F_001_ AS NUMERIC(18, 8)) / T1.Q_001_F_002_) - 1.0) * 100.0) ELSE (CAST(((CAST(T1.Q_001_F_002_ AS NUMERIC(37, 8)) / T1.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0) END AS NUMERIC(15, 2)) > @P1)*/

ORDER BY (CAST(CASE WHEN (T1.Q_001_F_001_ > T1.Q_001_F_002_) THEN (((CAST(T1.Q_001_F_001_ AS NUMERIC(18, 8)) / T1.Q_001_F_002_) - 1.0) * 100.0) ELSE (CAST(((CAST(T1.Q_001_F_002_ AS NUMERIC(37, 8)) / T1.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0) END AS NUMERIC(15, 2))) DESC', N'@P1 numeric(1,0)', 0


Если раскомментировать условие то возникает ошибка деления на ноль, условие соответствует последнему полю в запросе и ни одно из полей выступающих в роли знаменателя не принимает значение 0
В чем могла бы быть проблема?
15 июл 12, 22:20    [12870122]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
... / nullif(T1.Q_001_F_002_, 0)

И не будет больше ошибок деления на 0.
15 июл 12, 22:22    [12870130]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич,
там не может быть NULL - это точно, и если бы была проблема со значениями в полях, тогда и последнее поле запроса не вычислялось бы, оно такое же как и в условии
15 июл 12, 22:25    [12870137]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
izekia
Гавриленко Сергей Алексеевич,
там не может быть NULL - это точно, и если бы была проблема со значениями в полях, тогда и последнее поле запроса не вычислялось бы, оно такое же как и в условии
C чего Вы взяли, что вычисление происходит после проверки условия?
izekia
там не может быть NULL
А Вы знаете, что делает функция NULLIF?
15 июл 12, 22:28    [12870142]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
iap,
оно в принципе происходит, потому что без условия запрос нормально отрабатывает

про NULLIF не знал, спутал с другой, которая возвращает второй параметр, если первый NULL
15 июл 12, 22:35    [12870153]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
но в любом случае у меня T1.Q_001_F_002_ на момент выполнения условия не равно нулю, так же как и T1.Q_001_F_001_
15 июл 12, 22:38    [12870165]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
но в любом случае у меня T1.Q_001_F_002_ на момент выполнения условия не равно нулю, так же как и T1.Q_001_F_001_
Т.е. вы утверждаете, что ошибка деления на 0 возникла при делении не на 0? Сервер вас обманывает?
15 июл 12, 22:44    [12870187]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
Т.е. вы утверждаете, что ошибка деления на 0 возникла при делении не на 0? Сервер вас обманывает?


Я ничего не утверждаю, я хочу понять в чем проблема, чтобы больше с ней не сталкиваться
Я преобразовал запрос, поместил его без условия во вложенный, но ситуация не изменилась, если убрать комментарий в сравнении, то возникает ошибка:
Сообщение 8134, уровень 16, состояние 1, строка 1
Обнаружена ошибка: деление на ноль.

SELECT
T1.Q_002_F_000RRef,
T1.Q_002_F_001_,
T1.Q_002_F_002_,
T1.Q_002_F_003_
FROM (SELECT
T2.Q_001_F_000RRef AS Q_002_F_000RRef,
T2.Q_001_F_001_ AS Q_002_F_001_,
T2.Q_001_F_002_ AS Q_002_F_002_,
CAST(CASE WHEN (T2.Q_001_F_001_ > T2.Q_001_F_002_) THEN (((CAST(T2.Q_001_F_001_ AS NUMERIC(18, 8)) / T2.Q_001_F_002_) - 1.0) * 100.0) ELSE (CAST(((CAST(T2.Q_001_F_002_ AS NUMERIC(37, 8)) / T2.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0) END AS NUMERIC(15, 2)) AS Q_002_F_003_
FROM (SELECT
T4._IDRRef AS Q_001_F_000RRef,
T4._Fld2071 AS Q_001_F_001_,
CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) AS Q_001_F_002_
FROM _Document1823_VT1852 T3 WITH(NOLOCK)
LEFT OUTER JOIN _Document1823 T4 WITH(NOLOCK)
ON T3._Document1823_IDRRef = T4._IDRRef
WHERE (T4._Fld2071 > 0)
GROUP BY T4._IDRRef,
T4._Fld2071
HAVING ((CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) > 0) AND (CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) <> T4._Fld2071))) T2) T1
--WHERE T1.Q_002_F_003_ > 5


сорри, запрос из профайлера
15 июл 12, 22:53    [12870210]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
сорри, за оффтоп
есть ли средство автоформатирования, чтобы можно было нормально постить текст запроса?
15 июл 12, 22:55    [12870218]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Вот в нормальном виде, этот запрос работает, если убираем комментарий внизу, то возникает ошибка деления на ноль:
SELECT
T1.Q_002_F_000RRef,
T1.Q_002_F_001_,
T1.Q_002_F_002_,
T1.Q_002_F_003_
FROM
(SELECT
T2.Q_001_F_000RRef AS Q_002_F_000RRef,
T2.Q_001_F_001_ AS Q_002_F_001_,
T2.Q_001_F_002_ AS Q_002_F_002_,
CAST(
CASE
WHEN (T2.Q_001_F_001_ > T2.Q_001_F_002_) THEN (((CAST(T2.Q_001_F_001_ AS NUMERIC(18, 8)) / T2.Q_001_F_002_) - 1.0) * 100.0)
ELSE (CAST(((CAST(T2.Q_001_F_002_ AS NUMERIC(37, 8)) / T2.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0)
END AS NUMERIC(15, 2)) AS Q_002_F_003_
FROM
(SELECT
T4._IDRRef AS Q_001_F_000RRef,
T4._Fld2071 AS Q_001_F_001_,
CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) AS Q_001_F_002_
FROM
_Document1823_VT1852 T3 WITH(NOLOCK)
LEFT OUTER JOIN _Document1823 T4 WITH(NOLOCK)
ON T3._Document1823_IDRRef = T4._IDRRef
WHERE
(T4._Fld2071 > 0)
GROUP BY
T4._IDRRef,
T4._Fld2071
HAVING
((CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) > 0)
AND (CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) <> T4._Fld2071))
) T2
) T1
--WHERE T1.Q_002_F_003_ > 5
15 июл 12, 23:01    [12870229]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
забыл теги, сорри
SELECT
	T1.Q_002_F_000RRef,
	T1.Q_002_F_001_,
	T1.Q_002_F_002_,
	T1.Q_002_F_003_
FROM 
	(SELECT
		T2.Q_001_F_000RRef AS Q_002_F_000RRef,
		T2.Q_001_F_001_ AS Q_002_F_001_,
		T2.Q_001_F_002_ AS Q_002_F_002_,
		CAST(
			CASE 
				WHEN (T2.Q_001_F_001_ > T2.Q_001_F_002_) THEN (((CAST(T2.Q_001_F_001_ AS NUMERIC(18, 8)) / T2.Q_001_F_002_) - 1.0) * 100.0) 
				ELSE (CAST(((CAST(T2.Q_001_F_002_ AS NUMERIC(37, 8)) / T2.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0) 
			END AS NUMERIC(15, 2)) AS Q_002_F_003_
	FROM 
		(SELECT
			T4._IDRRef AS Q_001_F_000RRef,
			T4._Fld2071 AS Q_001_F_001_,
			CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) AS Q_001_F_002_
		FROM 
			_Document1823_VT1852 T3 WITH(NOLOCK)
			LEFT OUTER JOIN _Document1823 T4 WITH(NOLOCK)
			ON T3._Document1823_IDRRef = T4._IDRRef
		WHERE 
			(T4._Fld2071 > 0)
		GROUP BY 
			T4._IDRRef,
			T4._Fld2071
		HAVING 
			((CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) > 0) 
			AND (CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) <> T4._Fld2071))
		) T2
	) T1
--WHERE T1.Q_002_F_003_ > 5
15 июл 12, 23:02    [12870232]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Еще раз. Не хотите получать ошибку деления на 0 - не делите на 0. Как сделать, было сказано первым же ответом. А есть у вас там нули в ваших данных или нет, отсюда не видно. Да и не интересно выяснять.
15 июл 12, 23:06    [12870248]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
Еще раз. Не хотите получать ошибку деления на 0 - не делите на 0. Как сделать, было сказано первым же ответом. А есть у вас там нули в ваших данных или нет, отсюда не видно. Да и не интересно выяснять.

но в последнем запросе же нет деления вообще? это возникает в результате работы оптимизатора?
15 июл 12, 23:12    [12870264]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
izekia
но в последнем запросе же нет деления вообще?
Как это нет? Я нахожу 2 деления в запросе.
15 июл 12, 23:15    [12870279]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
alexeyvg
izekia
но в последнем запросе же нет деления вообще?
Как это нет? Я нахожу 2 деления в запросе.

запрос который я привел в последнем сообщении 12870232 отрабатывает без ошибок, но если убрать комментарий, то есть добавить условие:
WHERE T1.Q_002_F_003_ > 5
, тогда возникает ошибка связанная с делением на ноль.
Почему она возникает?
15 июл 12, 23:18    [12870291]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
но в последнем запросе же нет деления вообще? это возникает в результате работы оптимизатора?
Вы сейчас прикалываетесь, да?
15 июл 12, 23:18    [12870292]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
izekia
но в последнем запросе же нет деления вообще? это возникает в результате работы оптимизатора?
Вы сейчас прикалываетесь, да?

оно есть, но без условия запрос работает и ошибки не возникает ...
15 июл 12, 23:20    [12870303]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
оно есть, но без условия запрос работает и ошибки не возникает ...
И? Вы считаете, что при вашем условии ошибки деления на 0 не может возникнуть в принципе?
15 июл 12, 23:25    [12870317]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
И? Вы считаете, что при вашем условии ошибки деления на 0 не может возникнуть в принципе?

укажите мне на ошибку в моих рассуждениях?
если я могу выбрать полную выборку и ошибки не возникает, то почему когда я ее фильтрую с условием, то ошибка появляется?
15 июл 12, 23:30    [12870334]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
Гавриленко Сергей Алексеевич
И? Вы считаете, что при вашем условии ошибки деления на 0 не может возникнуть в принципе?

укажите мне на ошибку в моих рассуждениях?
если я могу выбрать полную выборку и ошибки не возникает, то почему когда я ее фильтрую с условием, то ошибка появляется?
Потому что у вас в ваших полях Q_001_F_002_ содержатся значения 0. И потому что сервер не обязан считать ваши выражения в самый последний момент, после всех фильтраций.

Сообщение было отредактировано: 15 июл 12, 23:38
15 июл 12, 23:37    [12870354]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич,
спасибо за ответы, видимо я не настолько хорошо разбираюсь в T-SQL, чтобы понять почему это происходит
15 июл 12, 23:42    [12870375]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
Гавриленко Сергей Алексеевич,
спасибо за ответы, видимо я не настолько хорошо разбираюсь в T-SQL, чтобы понять почему это происходит
Ответ в плане выполнения двух ваших запросов. Сравните и посмотрите в какой момент идет вычисление вашего выражения. Это если интересно разобраться, почему.

А чтобы не было деления -- nullif или case.
15 июл 12, 23:47    [12870395]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
Ответ в плане выполнения двух ваших запросов. Сравните и посмотрите в какой момент идет вычисление вашего выражения. Это если интересно разобраться, почему.

А чтобы не было деления -- nullif или case.

да, спасибо, просто для меня это немного неожиданно, надо подтянуть знания)
решил проблему путем дополнения дополнительной проверки на ноль в case
15 июл 12, 23:56    [12870413]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
izekia
Гавриленко Сергей Алексеевич
Ответ в плане выполнения двух ваших запросов. Сравните и посмотрите в какой момент идет вычисление вашего выражения. Это если интересно разобраться, почему.

А чтобы не было деления -- nullif или case.

да, спасибо, просто для меня это немного неожиданно, надо подтянуть знания)
решил проблему путем дополнения дополнительной проверки на ноль в case
C nullif() запись короче.
16 июл 12, 00:08    [12870431]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без условия отрабатывает, но с условием вызывает ошибку деления на ноль  [new]
izekia
Member

Откуда: Moscu
Сообщений: 868
Гавриленко Сергей Алексеевич
C nullif() запись короче.

у меня нет доступа к запросу, он генерится на сервере 1С
в языке запросов 1С такой конструкции нет)
спасибо еще раз за помощь
16 июл 12, 00:51    [12870501]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить