2017-02-14 111 views
1

考慮下面的存儲過程:有沒有辦法讓SQL Server存儲過程自動出錯?

CREATE PROCEDURE [dbo].[TestError] 
    @Input int 
AS 
BEGIN 
    DECLARE @Test int = 1/0; 

    INSERT TestTable (Number) 
    VALUES (@Input); 
END 

,把它:

EXEC TestError 123; 

當我執行這個存儲過程中,TestTable表依然被填充,儘管​​錯誤。

是否可以將存儲過程設置爲在出錯時自動退出,以便後續語句不會被執行?

+1

看看使用try/catch。 –

回答

2

set xact_abort on;添加到您的程序開始處。

create procedure [dbo].[TestError] @Input int as 
begin 
set xact_abort, nocount on; 
    declare @Test int = 1/0; 
    insert TestTable (Number) values (@Input); 
end 

Why you should always include set xact_abort, nocount on; - Erland Sommarskog

這開啓,默認情況下遺留原因是關閉兩屆選項,但經驗證明,最好的做法是始終有它們。沒有圍繞TRY-CATCH時,SQL Server中的缺省行爲是一些錯誤放棄執行並回滾任何打開的事務,而其他錯誤在下一個語句中繼續執行。當您激活XACT_ABORT ON時,幾乎所有錯誤都會產生相同的效果:任何打開的事務回滾並且執行被中止。其中最突出的是RAISERROR聲明。 - Erland Sommarskog

+0

太好了,謝謝!這正是我所期待的。 – reformed

+0

@reformed樂意幫忙! – SqlZim

相關問題