تقسیم بر صفر
  هنگامی که عددی را بر صفر تقسیم کنیم پیغام خطایی داده خواهد شد. برای جلویی گیری از بروز این چنین خطایی راه حلهای متنوعی وجود دارد.
   SQL Server
   ۱۶۹۶۹
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد سلیم آبادی
   ۱۳۸۹/۲/۲۴
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

هر تلاشی برای تقسیم یک عدد بر صفر منجر به بروز خطای روبروی خواهد شد: Divide by zero error encountered

چگونه می توانیم از این چنین اتفاق هایی جلویی گیری کنیم؟
در صورتی که شما به طور مکرر و ثابت مقدار یک ستون را بر یک ستون دیگر تقسیم می کنید بهتر است یک قید چک روی ستون مقسوم علیه تعریف کنید. بطور مثال در جدول زیر مقدار ستون X تقسیم به مقدار ستون Y می شود:

CREATE TABLE [Sample]
(--X / Y
 X INT NOT NULL,
 Y INT NOT NULL,
 CONSTRAINT PreventingDivideByZeroError 
    CHECK (Y <> 0));

 

ولی چگونه می توانیم در دستور SELECT مانع بروز این خطا شویم؟ ما قصد داریم در صورت صفر بودن مقسوم علیه، مقدار صفر و در غیر اینصورت مقدار X/Y به عنوان نتیجه انتخاب شود.
استاندارد ترین راه حل این است که از عبارت CASE برای بررسی مقدار مورد نظر استفاده کنیم، یعنی:

SELECT CASE WHEN Y = 0 THEN 0 
            ELSE X / Y
       END AS [X/Y]
FROM table_name;

و با کمک گرفتن از توابع داخلی SQL Server می توانیم یک ورژن فشرده تر ایجاد کنیم.
تابع NULLIF نیاز به دو پارامتر ورودی دارد اگر دو پارامتر با یکدگیر برابر بودند مقدار NULL برگردانده خواهد شد در غیر اینصورت مقدار پارامتر اول برمیگردد. از طرفی هر مقداری تقسیم بر NULL شود نتیجه اش NULL خواهد بود. و تابع COALESCE که حداقل نیاز به دو پارامتر دارد اولین مقدار غیر NULL را بر میگرداند. با ترکیب این دو تابع روش به شکل زیر در خواهد آمد:
البته شما به جای تابع COALESCE می توانید از تابع داخلی SQL Server به نام ISNULL استفاده کنید.

SELECT COALESCE(X / NULLIF(Y, 0), 0) AS Result
FROM table_name;