Как сделать хранимую процедуру неудачной, если условие не выполнено - PullRequest
0 голосов
/ 27 сентября 2019

Мне нужно, чтобы моя хранимая процедура не выполнялась, если условие не выполняется.Другими словами, я хочу что-то проверить, и если это не подтверждено, процедура должна сразу же завершиться и завершиться неудачей.

В настоящее время процедура не завершается ошибкой, если условие не выполняется.Это просто не идет к следующему шагу, но я хочу, чтобы он потерпел неудачу, поэтому я получаю уведомление.

Это довольно просто, но я не настолько умен.Вот что я написал:

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 ]

1 голос
/ 27 сентября 2019

Как упоминалось ранее, вы можете в любое время выдать ошибку в коде.Вы можете использовать либо 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;
0 голосов
/ 27 сентября 2019

Я полагаю, что ответ 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);
...