2013-07-20 3 views
2

У меня есть длинный скрипт, который содержит таблицы Create, создает схемы, вставляет данные, обновляет таблицы и т. Д. Я должен делать это только по сценарию в пакетном wise.I запускал его раньше, но он создавался каждый раз, когда некоторая ошибка из-за этого в базе данных будет присутствовать некоторый объект. Поэтому нужен какой-то механизм, который может обрабатывать пакетное выполнение, если что-то пойдет не так, весь скрипт должен быть откат.Выполнение пакетного сценария

Оценка и помощь.

--343

ответ

1

Попробуйте это:

DECLARE @outer_tran int; 
SELECT @outer_tran = @@TRANCOUNT; 

-- find out whether we are inside the outer transaction 
-- if yes - creating save point if no starting own transaction 
IF @outer_tran > 0 SAVE TRAN save_point ELSE BEGIN TRAN; 

BEGIN TRY 
    -- YOUR CODE HERE 

    -- if no errors and we have started own transaction - commit it 
    IF @outer_tran = 0 COMMIT; 
END TRY 
BEGIN CATCH 
    -- if error occurred - rollback whole transaction if it is own 
    -- or rollback to save point if we are inside the external transaction 
    IF @outer_tran > 0 ROLLBACK TRAN save_point ELSE ROLLBACK; 

    --and rethrow original exception to see what happens 
    DECLARE 
     @ErrorMessage nvarchar(max), 
     @ErrorSeverity int, 
     @ErrorState int; 

    SELECT 
     @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); 
END CATCH 
1

В то время как я не мог бы пойман все нюансы вашего вопроса, я считаю XACT_ABORT доставит функциональность, которую вы ищете. Просто добавьте

SET XACT_ABORT ON; 

в начало вашего скрипта.

С выпуском SQL Server 2005 года у вас есть доступ к блокам try/catch в TSQL.