如果不满足条件,我需要存储过程失败。换句话说,我要验证某些内容,如果未验证,则该过程应就此结束并失败。
当前,如果不满足条件,则过程不会失败。只是不进行下一步,但是我希望它失败,所以我会得到通知。
这很简单,但我并不聪明。这是我写的:
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,则什么也不会发生,并且存储过程在技术上是成功的。
我希望存储过程失败。我怎样才能做到这一点? 谢谢!
答案 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);