2017-02-14 1 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 таблица все еще получает, несмотря на ошибку divide by zero.

Можно ли установить хранимые процедуры для автоматического выхода из системы при ошибке, чтобы последующие операторы не выполнялись?

+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

Это включает две сессии варианты, которые по умолчанию отключена унаследованных причинам, но опыт показал, что лучше практика, чтобы всегда иметь их. Поведение по умолчанию в SQL Server, когда нет окружения TRY-CATCH, заключается в том, что некоторые ошибки прерывают выполнение и откатывают любую открытую транзакцию, тогда как с другими выполнением ошибок продолжается следующий оператор. Когда вы активируете XACT_ABORT ON, почти все ошибки имеют одинаковый эффект: любая открытая транзакция откатывается и выполнение прерывается. Есть несколько исключений, из которых наиболее заметным является заявление RAISERROR. - Erland Sommarskog

+0

Отлично, спасибо! Это именно то, что я искал. – reformed

+0

@reformed Happy, чтобы помочь! – SqlZim

Смежные вопросы