خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را
رفع ارور Msg 8134 در SQL Server
عملیاتهای ریاضی، مانند جمع و تفریق و غیره.. خیلی ساده و راحت در SQL Server امکان پذیر است. در اجرای اسکریپت هایی که عددی بر 0 تقسیم می شود، با خطای زیر مواجه می شوید.
برای جلوگیری از این خطا، چندین نوع کوئری را در ادامه بررسی می کنیم و با استفاده از آنها، شما می توانید شرایطی که نیاز است عددی بر 0 تقسیم شود و منجر به بروز خطا شود را کنترل کرده و از بروز خطا جلوگیری کنید.
زمانی که تقسیم کننده در این عملیات 0 باشد، متغیر @Result، برابر با Null خواهد و در @ErrorMsg هم جزئیات خطا قرار می گیرد:
زمانیکه تقسیم کننده 0 نباشد، متغیر @Result حاوی مقدار و @ErrorMsg حاوی NULL خواهد بود.
خروجی اجرای کوئری فوق:
Msg 8134, Level 16, State 1, Line 7
Divide by zero error encountered.
برای جلوگیری از این خطا، چندین نوع کوئری را در ادامه بررسی می کنیم و با استفاده از آنها، شما می توانید شرایطی که نیاز است عددی بر 0 تقسیم شود و منجر به بروز خطا شود را کنترل کرده و از بروز خطا جلوگیری کنید.
Option 1: Check For 0 And Make It NULL
با استفاده از تابع NULLIF، می توانید در شرایطی که عددی تقسیم کننده 0 است، آن را به Null تغییر دهید و در نتیجه عددی که به NULL تقسیم شود، نتیجه NULL خواهد شد.DECLARE @variable1 FLOAT,
@variable2 FLOAT;
SELECT @variable1 = 100,
@variable2 = 0;
SELECT @variable1 / NULLIF(@variable2, 0) Result;
Option 2: Handle The Exception
روش زیر برای مواقعی که عملیات ریاضی در داخل یک Stored Procedure انجام می شود، کاربردی خواهد بود. در SP زیر دو پارامتر وجود دارد که یکی برای گرفتن Result و دیگری برای رسیدن به خطا کاربرد دارد./** Create Stored procedure **/
CREATE PROCEDURE mtb_DivisionOperation
@Value1 FLOAT,
@Value2 FLOAT,
@Result FLOAT OUTPUT,
@Error NVARCHAR(MAX) OUTPUT
AS
BEGIN
BEGIN TRY
SET @Result = @Value1 / @Value2;
END TRY
BEGIN CATCH
SET @Error = 'Error Number: ' + CAST(ERROR_NUMBER() AS VARCHAR(10)) + '; ' + Char(10) +
'Error Severity: ' + CAST(ERROR_SEVERITY() AS VARCHAR(10)) + '; ' + Char(10) +
'Error State: ' + CAST(ERROR_STATE() AS VARCHAR(10)) + '; ' + Char(10) +
'Error Line: ' + CAST(ERROR_LINE() AS VARCHAR(10)) + '; ' + Char(10) +
'Error Message: ' + ERROR_MESSAGE()
END CATCH
END
GO
زمانی که تقسیم کننده در این عملیات 0 باشد، متغیر @Result، برابر با Null خواهد و در @ErrorMsg هم جزئیات خطا قرار می گیرد:
/** Execute Stored Procedure **/
DECLARE @ResultVal FLOAT
DECLARE @ErrorMsg NVARCHAR(MAX)
EXEC mtb_DivisionOperation
@Value1 = 100, @Value2 = 0,
@Result = @ResultVal OUTPUT, @Error = @ErrorMsg OUTPUT
SELECT @ResultVal AS 'Result'
SELECT @ErrorMsg AS 'Error Message'
GO
زمانیکه تقسیم کننده 0 نباشد، متغیر @Result حاوی مقدار و @ErrorMsg حاوی NULL خواهد بود.
/** Execute Stored Procedure **/
DECLARE @ResultVal FLOAT
DECLARE @ErrorMsg NVARCHAR(MAX)
EXEC mtb_DivisionOperation
@Value1 = 100, @Value2 = 3,
@Result = @ResultVal OUTPUT, @Error = @ErrorMsg OUTPUT
SELECT @ResultVal AS 'Result'
SELECT @ErrorMsg AS 'Error Message'
GO
خروجی اجرای کوئری فوق:
/** Results **/
Result
----------------------
33.3333333333333
(1 row affected)
Error Message
----------------------
NULL
(1 row affected)
نمایش دیدگاه ها (0 دیدگاه)
دیدگاه خود را ثبت کنید: