divide by zero error encountered перевод

Hello two days I have tried to figure out why my code isn’t working. I am quite sure that it’s a stupid mistake, but if anybody has time to check the code I would really appreciate. I have tried to comment out this «SUM» case, but then everything else breaks

I know that this line screws with me, but I can’t figure out how to fix this:

Error in SQL:Error in SQL:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Divide by zero error encountered.

Содержание

  1. 1 Answer 1
  2. Поддержка и обратная связь Support and feedback
  3. Это казалось лучшим решением для моей ситуации при попытке решить деление на ноль, что происходит в моих данных.

1 Answer 1

In SSMS, hit Ctrl+F to open the Find & Replace dialogue box. Search the query for all instances of / . This will tell you everywhere that division is happening, plus some false positives.

In every single instance, the query is dividing by mm.CaseQTY or bm.CaseQTY . Those are the only two values, and the only two tables you have to worry about. One or the other of them is coming through as a zero.

We don’t have access to your database, so we can’t help you troubleshoot the data issue, but that’s how I’d go about deciding where to start looking.

Деление на ноль невозможно. Division by zero isn’t possible. Эта ошибка имеет следующие причину и решение: This error has the following cause and solution:

Значение используемого в качестве делителя выражения является нолем. The value of an expression being used as a divisor is zero.

Проверьте правильность написания переменных в выражении. Check the spelling of variables in the expression. Неправильно написанное название переменной может незаметно создать числовую переменную, которая примет значение ноля. A misspelled variable name can implicitly create a numeric variable that is initialized to zero. Проверьте предыдущие операции с переменными в выражении, особенно передаваемых в процедуру в качествеаргументов из других процедур. Check previous operations on variables in the expression, especially those passed into the procedure asarguments from other procedures.

Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh). For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).

Поддержка и обратная связь Support and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

У меня есть это сообщение об ошибке:

Msg 8134, Уровень 16, Состояние 1, Строка 1 При обнаружении ошибки деления на ноль.

Каков наилучший способ написания кода SQL, чтобы я больше никогда не видел это сообщение об ошибке?

Я мог бы сделать одно из следующего:

  • Добавьте предложение where, чтобы мой делитель никогда не был равен нулю
  • Я мог бы добавить описание случая, чтобы был специальный режим для нуля.

Это лучший способ использовать предложение NULLIF ?

Есть ли лучший способ, или как это можно осуществить?

Чтобы избежать ошибки «Деление на ноль», мы запрограммировали ее так:

Но вот гораздо лучший способ сделать это:

Теперь единственная проблема — запомнить бит NullIf, если я использую клавишу «/».

Если вы хотите вернуть ноль, если произойдет нулевое деление, вы можете использовать:

Для каждого делителя, равного нулю, вы получите нуль в наборе результатов.

Это казалось лучшим решением для моей ситуации при попытке решить деление на ноль, что происходит в моих данных.

Предположим, вы хотите рассчитать соотношение между мужчинами и женщинами для разных школьных клубов, но вы обнаружите, что следующий запрос завершается с ошибкой и выдает ошибку «разделить на нуль», когда он пытается рассчитать соотношение для клуба Lord of the Rings, который не имеет женщин:

Вы можете использовать функцию NULLIF , чтобы избежать деления на ноль. NULLIF сравнивает два выражения и возвращает null, если они равны, или первое выражение в противном случае.

Перепишите запрос как:

Любое число, деленное на NULL , дает NULL , и никакая ошибка не генерируется.

Вы также можете сделать это в начале запроса:

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

Вы можете по крайней мере остановить запрос от взлома с ошибкой и вернуть NULL , если есть деление на ноль:

Тем не менее, я бы НИКОГДА не конвертировал это в Zero с coalesce , как показано в этом другом ответе, который получил много upvotes. Это совершенно неправильно в математическом смысле, и это даже опасно, так как ваше приложение, скорее всего, вернет неправильные и вводящие в заблуждение результаты.

EDIT: В последнее время я получаю много downvotes. поэтому я подумал, что просто добавлю примечание о том, что этот ответ был написан до того, как вопрос подвергся самому последнему редактированию, где возврат нулевого значения был выделен как опция. который кажется очень приемлемым. Некоторые из моих ответов были адресованы таким опасениям, как Эдвардо, в комментариях, которые, казалось, выступали за возвращение 0. Это тот случай, с которым я выступал.

ОТВЕТ: Я думаю, что здесь существует основная проблема, которая заключается в том, что разделение на 0 не является законным. Это признак того, что что-то фундаментально неправильно. Если вы делите на ноль, вы пытаетесь сделать что-то, что не имеет смысла математически, поэтому числовой ответ, который вы можете получить, будет действительным. (Использование null в этом случае является разумным, поскольку оно не является значением, которое будет использоваться в последующих математических вычислениях).

Итак, Эдвардо спрашивает в комментариях: «Что, если пользователь ставит 0?», и он защищает, что должно быть хорошо получить 0 взамен. Если пользователь ставит нуль в сумму и вы хотите вернуть 0, когда они это делают, тогда вы должны ввести код на уровне бизнес-правил, чтобы поймать это значение и вернуть 0. не иметь специального случая, когда деление на 0 = 0.

Это тонкая разница, но это важно. потому что в следующий раз, когда кто-то называет вашу функцию и ожидает, что она сделает правильную вещь, и она делает что-то фанки, которое не является математически правильным, а просто обрабатывает конкретный случай края у него были хорошие шансы кусать кого-то позже. Вы на самом деле не делите на 0. вы просто возвращаете плохой ответ на плохой вопрос.

Представьте, что я что-то кодирую, и я это испортил. Я должен читать значение масштабирования измерения излучения, но в странном краевом случае, который я не ожидал, я читаю в 0. Затем я понижаю значение в вашей функции. вы возвращаете мне 0! Ура, без излучения! Кроме того, что это действительно так, и это просто то, что у меня плохое значение. но я понятия не имею. Я хочу, чтобы деление выбрасывало ошибку, потому что это флаг, что-то не так.

Источник: computermaker.info

Понравилась статья? Поделиться с друзьями:
Ок! Компьютер
Добавить комментарий