2017-02-14 87 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

相关问题