Як уникнути помилки "поділити на нуль" у SQL?


363

У мене є повідомлення про помилку:

Msg 8134, Рівень 16, стан 1, рядок 1 Розділіть на нульову помилку.

Який найкращий спосіб написати SQL-код, щоб я більше ніколи не побачив це повідомлення про помилку?

Я можу зробити щось із наступного:

  • Додайте пункт де, щоб мій дільник ніколи не дорівнював нулю

Або

  • Я можу додати заяву справи, щоб було спеціальне звернення до нуля.

Чи найкращий спосіб використовувати NULLIFпункт?

Чи є кращий спосіб, або як це можна застосувати?


7
Можливо, якась перевірка даних в порядку.
Ентоні

Відповіді:


644

Щоб уникнути помилки "Поділ на нуль", ми запрограмували її так:

Select Case when divisor=0 then null
Else dividend / divisor
End ,,,

Але ось набагато приємніший спосіб зробити це:

Select dividend / NULLIF(divisor, 0) ...

Тепер єдина проблема - запам'ятати біт NullIf, якщо я використовую клавішу "/".


13
Набагато приємніший спосіб зробити це "Виберіть дивіденд / нуліф (дільник, 0) ..." розбивається, якщо дільник NULL.
Андерсон

8
@Anderson Це зовсім не так. Ви впевнені, що IsNullзамість цього не скористалися NullIf? Спробуйте самі! SELECT Value,1/NullIf(Value,0)FROM(VALUES(0),(5.0),(NULL))x(Value);Якщо під "перервами" ви не маєте на увазі повернення NULL? Ви можете перетворити це на все, що завгодно з IsNullабо Coalesce.
ЕрікЕ

1
@ErikE, це правда ... спробуйте запустити ... виберіть 1 / nullif (null, 0) ... ви отримаєте "Тип першого аргументу NULLIF не може бути константою NULL, оскільки тип першого аргументу має бути відомим ». Зробіть це, використовуючи "coalesce (FieldName, 0)" ... наприклад, виберіть 1 / nullif (coalesce (null, 0), 0)
John Joseph

1
@JohnJoseph Я не можу сказати, чи погоджуєтесь ви зі мною чи сперечаєтесь зі мною.
ЕрікЕ

1
@JohnJoseph Подивіться уважніше на вашу помилку. Так, SELECT 1 / NULLIF(NULL, 0)не вдається, але це тому, що NULLIF()потрібно знати тип даних першого аргументу. Це змінений приклад працює нормально: SELECT 1 / NULLIF(CAST(NULL AS INT), 0). У реальному житті ви збираєтесь подавати стовпчик таблиці, NULLIF()а не NULLконстанту. Оскільки стовпці таблиці мають відомі типи даних, це також працює відмінно: SELECT 1 / NULLIF(SomeNullableColumn, 0) FROM SomeTable.
MarredCheese

180

У випадку, якщо ви хочете повернути нуль, у випадку, якщо станеться нульове відхилення, ви можете використовувати:

SELECT COALESCE(dividend / NULLIF(divisor,0), 0) FROM sometable

Для кожного дільника, який дорівнює нулю, ви отримаєте нуль у наборі результатів.


9
Деякі орієнтири виявляють, що КОАЛЕСС трохи повільніше, ніж ІСНУЛЬНО. Однак COALESCE є у стандартах, тому вона є більш портативною.
Пол Черноч

37
Якщо хтось не одразу зрозуміє, чому це працює, NULLIF (d, 0) поверне NULL, якщо d дорівнює 0. У SQL ділення на NULL повертає NULL. Coalesce замінює отриманий NULL на 0.
GuiSim

16
@SQLGeorge Хоча я погоджуюся з вашим аргументом, зауважте, що є випадки, що хтось більше цікавиться тим, що є статистично правильним, ніж математично правильним. У деяких випадках при використанні функцій статистики 0 або навіть 1 є прийнятним результатом, коли дільник дорівнює нулю.
Афафуд

10
Хтось може мені пояснити, чому це погано? Якщо я намагаюся з'ясувати відсоток, а дільник дорівнює нулю, я, звичайно, хочу, щоб результат був нульовим відсотком.
Тодд Різкий

10
Я думаю, що @George та @ James / Wilson принципово неправильно розуміють питання, яке задають. Звичайно, є бізнес-програми, де повернення "0" є доцільним, навіть якщо це технічно не відповідає математичній точки зору.
Шон Бранч

66

Це здавалося найкращим виправленням моєї ситуації, коли я намагався вирішити ділення на нуль, що трапляється в моїх даних.

Припустимо, ви хочете обчислити співвідношення чоловіки та жінки для різних шкільних клубів, але ви виявите, що наступний запит виявляється невдалим і видає помилку поділу на нуль, коли він намагається обчислити коефіцієнт для клубу "Володар кілець", в якому немає жінок :

SELECT club_id, males, females, males/females AS ratio
  FROM school_clubs;

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

Перепишіть запит як:

SELECT club_id, males, females, males/NULLIF(females, 0) AS ratio
  FROM school_clubs;

Будь-яке число, поділене на NULLдає NULL, і помилка не генерується.


6
Так, дійсно, це ШЛИШЕ краще, ніж інша відповідь, яка отримала так багато відгуків. У своєму рішенні у вас є принаймні NULL, що вказує на те, що ви не можете надати правильний результат. Але якщо перетворити результат з NULL в Zero, то ви просто отримаєте неправильні та оманливі результати.
SQL Police

8
До речі, якщо ви хочете , щоб обчислити / жіноче співвідношення чоловіків, то я пропоную , щоб краще порівняти його із загальним, як це: select males/(males+females), females/(males+females). Це дасть вам відсотковий розподіл чоловіків і жінок в клубі, наприклад, 31% чоловіків, 69% жінок.
SQL Police

44

Ви також можете це зробити на початку запиту:

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

Тож якщо у вас є щось подібне, 100/0воно поверне NULL. Я робив це лише для простих запитів, тому не знаю, як це вплине на довші / складніші.


1
Працює для мене. У моєму випадку я повинен використовувати ділення операції в пункті WHERE. Я впевнений, що немає дільника нуля, тому що, коли я коментую, де ВІД, немає нульових значень при результатах. Але якось оптимізатор запитів ділиться на нуль під час фільтрації. SET ARITHABORT OFF SET та ANSI_WARNINGS OFF роблять це - після 2 днів боротьби з діленням на нуль за пунктом WHERE. Дякую!
huhu78

2
Це "відчуває" себе так брудно, але я люблю це! Потрібно було це у запиті, який робить агрегацію та використання оператора CASE, не є варіантом, тому що тоді мені довелося додати цей стовпець до групи GROUP BY, який повністю змінив результати. Зробити початковий запит підселектом, а потім виконати GROUP BY на зовнішньому запиті, також змінюються результати, оскільки тут бере участь поділ.
Ендрю Штайц

1
Гаразд, тому мені все одно подобається це "рішення", але, як багато хто з вас, напевно, відчував, я відчував, що повинен бути "чистіший" спосіб. Що робити, якщо я забув повторно включити попередження? Або хтось клонував мій код (цього ніколи не буває, правда?) І не замислювався над попередженнями? У будь-якому разі бачив інші відповіді про NULLIF (). Я знав про NULLIF (), але не зрозумів, що розділення на NULL повертає NULL (я думав, що це буде помилка). Отже ... Я пішов із наступним: ISNULL ((SUM (foo) / NULLIF (SUM (bar), 0)), 0)), 0) AS Avg
Andrew Steitz

2
Я не знав цього рішення. Я не впевнений, що мені це подобається, але це може бути корисно знати, колись. Дуже дякую.
Генрік Стаун Поульсен

1
Це найпростіше рішення, але зауважте, що це зашкодить продуктивності. Від docs.microsoft.com/en-us/sql/t-sql/statements/… : "Встановлення ARITHABORT на OFF може негативно впливати на оптимізацію запитів, що призводить до проблем з продуктивністю."
mono blaine

36

Ви можете принаймні зупинити запит на розрив із помилкою та повернутись, NULLякщо є поділ на нуль:

SELECT a / NULLIF(b, 0) FROM t 

Однак я б ніколи не перетворював це на нуль, coalesceяк це показано в тій іншій відповіді, яка отримала багато результатів. У математичному сенсі це абсолютно неправильно, і це навіть небезпечно, оскільки ваша програма, ймовірно, поверне неправильні та оманливі результати.


32

EDIT: Я останнім часом отримую багато зворотних запитів ... тому я подумав, що просто додам зауваження, що ця відповідь була написана до того, як питання було проведено останнє редагування, де в якості опції було вказано повернення нуля. .що здається дуже прийнятним. Частина моєї відповіді була спрямована на такі проблеми, як у Едвардо, у коментарях, які, здається, виступають за повернення 0. Оце я виступив проти мене.

ВІДПОВІДЬ: Я думаю, що тут є основна проблема, яка полягає в тому, що поділ на 0 не є законним. Це вказівка ​​на те, що щось є фундаментально неправильним. Якщо ви ділите на нуль, ви намагаєтесь зробити щось, що математично не має сенсу, тому жодна числова відповідь, яку ви можете отримати, не буде дійсною. (Використання нуля в цьому випадку є розумним, оскільки це не значення, яке буде використано в наступних математичних обчисленнях).

Тож Едвард запитує в коментарях "що робити, якщо користувач поставить 0?", І він виступає за те, щоб було добре, щоб отримати 0 взамін. Якщо користувач вводить нуль у суму, а ви хочете, щоб 0 повернулися, коли вони це роблять, тоді вам слід ввести код на рівні бізнес-правил, щоб отримати це значення і повернути 0 ... не мати спеціального випадку, де поділ на 0 = 0.

Це тонка різниця, але це важливо ... тому що наступного разу, коли хтось зателефонує вашій функції та очікує, що вона зробить правильно, і це зробить щось фанкі, що не є математично правильним, а просто обробляє конкретний край випадку, він має хороший шанс вкусити когось пізніше. Ви насправді не ділите на 0 ... ви просто повертаєте погану відповідь на погану запитання.

Уявіть, що я кодую щось, і я це накручую. Я мав би читати значення масштабу вимірювання випромінювання, але у випадку, коли я не передбачив, я читав у 0. Я потім скидаю своє значення у вашу функцію ... ви повертаєте мені 0! Ура, радіації немає! За винятком того, що він насправді є, і це просто те, що я проходив у поганому значенні ... але поняття не маю. Я хочу, щоб дивізія викинула помилку, оскільки це прапор, що щось не так.


15
Я не погоджуюсь. Правила вашого бізнесу ніколи не повинні закінчувати займатися незаконною математикою. Якщо ви в кінцевому підсумку робите щось подібне, швидше за все, ваша модель даних неправильна. Кожного разу, коли ви стикаєтеся з розділенням на 0, слід замислюватися, чи мали би бути дані NULL замість 0.
Remus Rusanu

32
Я не можу повірити, що мене образив хтось, хто запитує, чи я коли-небудь "займався реальним програмуванням?" бо я кажу, що робити це правильно, а не лінуватися. зітхання
Беська

11
Вибачте, я не хотів вас образити. Але питання цілком справедливо у багатьох поширених програмах LOB, а відповідь на нього "поділом на 0 не є законним" не додає значення IMHO.
Едуардо Молтені

2
@JackDouglas Правильно. Це випадок, коли ви хочете, щоб ділові правила по-особливому обробляли особливий випадок ... але це не повинно бути основою математики, яка повертає пробіл. Це повинно бути діловим правилом. Прийнята відповідь повертає нуль, що є нормальним способом впоратися з цим. Кидати виняток теж було б добре. Виявити його та обробляти перед тим, як перейти до SQL, було б, мабуть, ідеально. Надання якоїсь функції, яку могли б викликати інші речі, що повернув математично неправильне значення, - це не шлях, оскільки цей особливий випадок може не застосовуватися для інших абонентів.
Беска

4
@JackDouglas Так, з цим я погоджуюся. Спочатку питання, здавалося, було виражене як "що я можу зробити, щоб просто приховати цю помилку". З тих пір вона розвивалася. Повернувши нуль, відповідь, до якої він, врешті-решт, приходить, здається одним розумним відгуком. (Я наполегливо виступав за те, щоб не повертати 0 або якесь інше число.)
Беска,

28
SELECT Dividend / ISNULL(NULLIF(Divisor,0), 1) AS Result from table

Уловивши нуль за допомогою nullif (), то отриманий нуль з isnull () ви можете обійти ділення на нульову помилку.


3
Через свою тривалість відповідь було рекомендовано для видалення. Зауважте, що завжди краще додати невелике пояснення того, що ви пропонуєте - навіть якщо це здається дуже простим;)
Тринімон

10

Заміна "ділити на нуль" нулем суперечливо - але це також не єдиний варіант. У деяких випадках заміна на 1 є (розумно) доцільною. Я часто опиняюся на використанні

 ISNULL(Numerator/NULLIF(Divisor,0),1)

коли я переглядаю зрушення в балах / підрахунках, і хочу за замовчуванням до 1, якщо у мене немає даних. Наприклад

NewScore = OldScore *  ISNULL(NewSampleScore/NULLIF(OldSampleScore,0),1) 

Частіше за все я фактично обчислював це співвідношення десь в іншому місці (не в останню чергу тому, що він може кинути дуже великі коефіцієнти коригування для низьких знаменників. У цьому випадку я, як правило, для OldSampleScore перевищує поріг, який потім виключає нуль . Іноді "хак" доречний.


1
@N Мейсон; так, іноді 1 - це варіант. Але як ви пам’ятаєте частину ISNULL під час введення зворотної косої риски?
Генрік Стаун Поульсен

1
Вибачте, Генрік - я не впевнений, що розумію питання.
N Mason

6

Я деякий час назад написав функцію, щоб обробляти її для своїх збережених процедур :

print 'Creating safeDivide Stored Proc ...'
go

if exists (select * from dbo.sysobjects where  name = 'safeDivide') drop function safeDivide;
go

create function dbo.safeDivide( @Numerator decimal(38,19), @divisor decimal(39,19))
   returns decimal(38,19)
begin
 -- **************************************************************************
 --  Procedure: safeDivide()
 --     Author: Ron Savage, Central, ex: 1282
 --       Date: 06/22/2004
 --
 --  Description:
 --  This function divides the first argument by the second argument after
 --  checking for NULL or 0 divisors to avoid "divide by zero" errors.
 -- Change History:
 --
 -- Date        Init. Description
 -- 05/14/2009  RS    Updated to handle really freaking big numbers, just in
 --                   case. :-)
 -- 05/14/2009  RS    Updated to handle negative divisors.
 -- **************************************************************************
   declare @p_product    decimal(38,19);

   select @p_product = null;

   if ( @divisor is not null and @divisor <> 0 and @Numerator is not null )
      select @p_product = @Numerator / @divisor;

   return(@p_product)
end
go

2
Привіт Рон, хороше рішення, за винятком того, що він має обмежений тип даних (4 десяткових знаки), і наші @divisors також можуть бути негативними. І як ви застосовуєте його використання? TIA Henrik Staun Poulsen
Henrik Staun Poulsen

1
Я вирішив це досить швидко, щоб вирішити конкретний сценарій проблеми на той час. Одномісний додаток для розробників, тому примусовий контроль не такий складний, крім моєї пам'яті. :-)
Рон Савідж,

5
Незважаючи на заяву про друк, це не зберігається протокол, це скалярний АДС. Це вб'є вас у MS-SQL, якщо це частина запиту.
Марк Совул

4
Я погодився із твердженням Марка Совула, що скалярна функція спричинятиме біль. Це жахлива пропозиція в T-SQL, не робіть цього! Скалярні функції - це руйнівники продуктивності! Функція, що оцінюється в таблиці, є єдиними хорошими функціями користувача в SQL Server (можливо, за винятком функцій CLR, які можуть працювати добре).
Давос

4
  1. Додайте обмеження CHECK, яке змушує Divisorбути не нульовим
  2. Додайте у форму валідатор, щоб користувач не міг вводити нульові значення в це поле.

1
Мені все більше і більше подобаються обмеження ПЕРЕВІРИ.
Генрік Стаун Поульсен

4

Для оновлення SQL:

update Table1 set Col1 = Col2 / ISNULL(NULLIF(Col3,0),1)

3
привіт Vijay, Так, це спрацює, але ... Я був би обережний щодо ISNULL частини, де ви в кінцевому підсумку ділите на NULL. Я б скоріше повідомив користувачеві, що результат невідомий, оскільки дільник дорівнює нулю.
Генрік Стаун Поульсен

2
Це врятувало мене у складній підзапросі, спасибі.
QMaster

3

Немає чарівних глобальних налаштувань "поворот поділу на 0 виключення вимкнено". Операція повинна кидатись, оскільки математичне значення x / 0 відрізняється від значення NULL, тому воно не може повернути NULL. Я припускаю, що ви дбаєте про очевидність, і у ваших запитах є умови, які повинні усунути записи з дільником 0 і ніколи не оцінювати поділ. Звичайна "gotcha" - це не те, що більшість розробників очікує, що SQL поводиться як процедурні мови та пропонує коротке замикання логічного оператора, але це НЕ . Рекомендую прочитати цю статтю: http://www.sqlmag.com/Articles/ArticleID/9148/pg/2/2.html


4
Існує така "Чарівна глобальна установка"; ВИМКНЕННЯ АРІТАБОРТУ ВИКЛ.
Девід Манхейм

3

Ось ситуація, коли можна розділити на нуль. Правило бізнесу полягає в тому, що для обчислення оборотів запасів ви приймаєте вартість товарів, що продаються за певний період, анулюють його. Після того, як у вас з'явиться річна кількість, ви поділите на середню кількість запасів за період.

Я дивлюся на підрахунок кількості витків запасів, які трапляються за три місяці. Я підрахував, що у мене вартість товарів, проданих протягом тримісячного періоду, становить 1000 доларів. Річна норма продажу - 4000 доларів (1000 доларів / 3) * 12. Початковий інвентар - 0. Кінцевий інвентар - 0. Мій середній інвентар зараз 0. Я продаю 4000 доларів на рік, а запасів немає. Це дає нескінченну кількість витків. Це означає, що весь мій інвентар переробляється та купується клієнтами.

Це ділове правило, як обчислювати обороти запасів.


3
Так, тоді у вас є нескінченна кількість витків. Тож у такому випадку, якщо у вас є ділення на нуль, ви повинні показати щось на зразок "#INF".
SQL Police

1
"Початковий інвентар - 0. Кінцевий інвентар - 0. Мій середній інвентар зараз 0." Ваш розрахунок - це оцінка. На деякий час запас є позитивним, або ви нічого не можете доставити / продати. Якщо ви не задоволені результатом + ∞, використовуйте кращу оцінку середньої кількості запасів.
Том Блоджет

2
CREATE FUNCTION dbo.Divide(@Numerator Real, @Denominator Real)
RETURNS Real AS
/*
Purpose:      Handle Division by Zero errors
Description:  User Defined Scalar Function
Parameter(s): @Numerator and @Denominator

Test it:

SELECT 'Numerator = 0' Division, dbo.fn_CORP_Divide(0,16) Results
UNION ALL
SELECT 'Denominator = 0', dbo.fn_CORP_Divide(16,0)
UNION ALL
SELECT 'Numerator is NULL', dbo.fn_CORP_Divide(NULL,16)
UNION ALL
SELECT 'Denominator is NULL', dbo.fn_CORP_Divide(16,NULL)
UNION ALL
SELECT 'Numerator & Denominator is NULL', dbo.fn_CORP_Divide(NULL,NULL)
UNION ALL
SELECT 'Numerator & Denominator = 0', dbo.fn_CORP_Divide(0,0)
UNION ALL
SELECT '16 / 4', dbo.fn_CORP_Divide(16,4)
UNION ALL
SELECT '16 / 3', dbo.fn_CORP_Divide(16,3)

*/
BEGIN
    RETURN
        CASE WHEN @Denominator = 0 THEN
            NULL
        ELSE
            @Numerator / @Denominator
        END
END
GO

Мені не подобається ваше рішення, тому що використання UDF змушує запит запускатися в режимі єдиного потоку. Мені подобається ваша тестова установка. Я хотів би, щоб це було у всіх наших АДС.
Генрік Стаун Поульсен

Для мене це рішення ідеальне та елегантне
Payedimaunt

@Payedimaunt; так, UDF призводять до дуже елегантного коду. Але це не дуже добре. Це «курсори на снодійне». :-) Також важко запам’ятати, щоб написати dbo.Поділіть замість звичайного "/"
Генрік Стаун Поульсен


1

Іноді 0 може бути невідповідним, але іноді 1 теж не підходить. Іноді стрибок від 0 до 100 000 000, описаний як 1 або 100-відсоткова зміна, також може ввести в оману. 100 000 000 відсотків можуть бути доречними в цьому сценарії. Це залежить від того, які висновки ви збираєтесь робити на основі відсотків або співвідношень.

Наприклад, дуже дрібний товар, що переходить від 2-4 проданих, і дуже великопродажний товар, який змінюється від 1 000 000 до 2 000 000 проданих, може означати для аналітика чи керівництва дуже різні речі, але обидва вони виходять як 100% або 1 змінити.

Ізолювати значення NULL може бути простіше, ніж перебирати купу 0% або 100% рядків, змішаних з законними даними. Часто 0 в знаменнику може вказувати на помилку або відсутнє значення, і ви, можливо, не захочете просто заповнити довільне значення лише для того, щоб ваш набір даних виглядав охайним.

CASE
     WHEN [Denominator] = 0
     THEN NULL --or any value or sub case
     ELSE [Numerator]/[Denominator]
END as DivisionProblem

1
Я вважаю, що проблема полягає в тому, щоб пам'ятати робити щось, коли ви хочете зробити поділ. Якщо ви не пам’ятаєте додавання CASE або NULLIF, у понеділок вранці ви отримаєте справу підтримки через x тижнів. Ненавиджу це.
Генрік Стаун Поульсен

1

Ось як я це виправив:

IIF (ValueA! = 0, сумарно / значенняA, 0)

Його можна загорнути в оновлення:

SET Pct = IIF (ValueA! = 0, Total / ValueA, 0)

Або у вибраному:

SELECT IIF (ValueA! = 0, Total / ValueA, 0) AS Pct FAME від імені таблиці;

Думки?


Я та інші вважаємо, що заміна «невідомого» нулем - небезпечне виправлення. Я дуже віддаю перевагу NULL. Але важкий біт - пам’ятати, щоб додати iif або нуліф на всі підрозділи!
Генрік Стаун Поульсен

0

Ви можете відповідним чином обробити помилку, коли вона розповсюджується на програму виклику (або проігнорує її, якщо ви цього хочете). У C # будь-які помилки, що трапляються в SQL, викинуть виняток, який я можу впізнати, а потім обробити свій код, як і будь-яка інша помилка.

Я погоджуюся з Бескою в тому, що ви не хочете приховувати помилку. Ви не можете мати справу з ядерним реактором, але приховувати помилки взагалі - це погана практика програмування. Це одна з причин, коли більшість сучасних мов програмування реалізують структуровану обробку винятків для декупажу фактичного значення повернення з кодом помилки / стану. Особливо це стосується математики. Найбільша проблема полягає в тому, що ви не можете розрізняти правильно обчислені 0, що повертаються, або 0 в результаті помилки. Натомість будь-яке повернене значення - це обчислене значення, і якщо щось піде не так, викидається виняток. Це, звичайно, буде відрізнятися залежно від способу доступу до бази даних та мови, якою ви користуєтесь, але ви завжди маєте змогу отримати повідомлення про помилку, з яким ви можете мати справу.

try
{
    Database.ComputePercentage();
}
catch (SqlException e)
{
    // now you can handle the exception or at least log that the exception was thrown if you choose not to handle it
    // Exception Details: System.Data.SqlClient.SqlException: Divide by zero error encountered.
}

1
Я думаю, що ми всі згодні, що приховування помилки за допомогою 0 не є рішенням. Я пропоную написати наш код таким чином, щоб за кожним "/" супроводжувався "NULLIF". Таким чином, мій звіт / ядерний реактор не залишається в спокої, але показує "NULL" замість тієї прискіпливої ​​помилки Msg 8134. Причини, якщо мені потрібен інший процес, коли дільник 0, то Беска і я згоден. Нам потрібно це кодувати. Це просто важко робити кожен раз, коли пишеш "/". "/ NULLIF" робити це неможливо кожен раз.
Генрік Стаун Поульсен

0

Використовуйте, NULLIF(exp,0)але таким чином -NULLIF(ISNULL(exp,0),0)

NULLIF(exp,0)перерви, якщо exp є, nullале NULLIF(ISNULL(exp,0),0)не зламається


1
Я не можу отримати NULLIF (exp, 0), якщо 0 - нуль, а не о. Спробуйте; DECLARE @i INT SELECT 1 / NULLIF (@i, 0), щоб побачити, чи зможете ви його зламати.
Генрік Стаун Поульсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.