Как зафиксировать и откатить транзакцию на сервере sql? - PullRequest
15 голосов
/ 14 октября 2010

У меня есть огромный скрипт для создания таблиц и переноса данных с одного сервера.Таким образом, этот сценарий в основном имеет -

  1. Создание операторов для таблиц.
  2. Вставка для переноса данных в эти вновь созданные таблицы.
  3. Создание операторов для хранимых процедур.

Так что у меня есть этот код, но он не работает в принципе @@ ERROR всегда равен нулю, я думаю ..

BEGIN TRANSACTION
--CREATES
--INSERTS
--STORED PROCEDURES CREATES
    -- ON ERROR ROLLBACK ELSE COMMIT THE TRANSACTION
    IF @@ERROR != 0
        BEGIN

            PRINT @@ERROR
                      PRINT 'ERROR IN SCRIPT'
            ROLLBACK TRANSACTION
            RETURN
        END
    ELSE
    BEGIN
        COMMIT TRANSACTION
        PRINT 'COMMITTED SUCCESSFULLY'
    END
    GO

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

Ответы [ 3 ]

26 голосов
/ 15 октября 2010

Не используйте @@ERROR, используйте BEGIN TRY/BEGIN CATCH.См. Эту статью: Обработка исключений и вложенные транзакции для примера процедуры:

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0   
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
        return;
    end catch   
end
2 голосов
/ 14 октября 2010

Согласно http://msdn.microsoft.com/en-us/library/ms188790.aspx

@@ ОШИБКА: возвращает номер ошибки для последнего выполненного оператора Transact-SQL.

Вам придется проверять после каждого оператора, чтобы выполнить откат и возврат.

Фиксация может быть в конце.

НТН

0 голосов
/ 15 октября 2014

Избегайте прямых ссылок на @@ ERROR.Это легкая вещь, которую можно потерять.

Declare @ErrorCode int;
... perform stuff ...
Set @ErrorCode = @@ERROR;
... other stuff ...
if @ErrorCode ...... 
...