如果不满足条件,如何使存储过程失败

时间:2019-09-27 15:54:43

标签: sql sql-server stored-procedures error-handling

如果不满足条件,我需要存储过程失败。换句话说,我要验证某些内容,如果未验证,则该过程应就此结束并失败。

当前,如果不满足条件,则过程不会失败。只是不进行下一步,但是我希望它失败,所以我会得到通知。

这很简单,但我并不聪明。这是我写的:

declare @IncompleteRows int                                            
set @IncompleteRows = (select Count(*) from DimTable where Incomplete = 1)

if @IncompleteRows = 0

begin                                                                            
update DimTable2                                                               
set Column1 = 'X'                                                          
end 

因此,如果@IncompleteRows = 0,那么将根据需要更新Table2。
但是,如果@IncompleteRows不为0,则什么也不会发生,并且存储过程在技术上是成功的。

我希望存储过程失败。我怎样才能做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:1)

如前所述,您可以随时在代码中引发错误。您可以使用RAISERROR或THROW(我相信它是在2012年实现的)。您也不需要变量或计数。

IF NOT EXISTS(select * from DimTable where Incomplete = 1)
BEGIN                                                                            
    UPDATE DimTable2
    SET Column1 = 'X';
END 
ELSE
    RAISERROR('There are no rows in DimTable where Incomplete equals 1', --Message
            16, --Severity
            1); --State

IF NOT EXISTS(select * from DimTable where Incomplete = 1)
BEGIN                                                                            
    UPDATE DimTable2
    SET Column1 = 'X';
END 
ELSE
    THROW 52000, --Error number must be between 50000 and  2147483647.
        'There are no rows in DimTable where Incomplete equals 1', --Message
        1; --State

您还可以使用RETURN结束该过程而不会出现错误。如果返回的值不同于0,则可以将其用作应用程序代码中某些错误的指示。

IF NOT EXISTS(select * from DimTable where Incomplete = 1)
BEGIN                                                                            
    UPDATE DimTable2
    SET Column1 = 'X';
END 
ELSE
    RETURN 10;

答案 1 :(得分:0)

我猜答案是RAISERROR

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms178592(v=sql.100)

类似这样的东西:

if @IncompleteRows = 0
  update DimTable2
     set Column1 = 'X';
else
  RAISERROR('I expected the query to return 0 records', 1, 1);