Как совершить транзакцию и выполнить транзакцию на сервере sql?

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

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

Итак, у меня есть этот код, но он не работает в основном @@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 как-то здесь..

Ответы

Ответ 1

Не используйте @@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

По http://msdn.microsoft.com/en-us/library/ms188790.aspx

@@ERROR: возвращает номер ошибки для последней инструкции Transact-SQL.

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

Фиксировать можно в конце.

НТН

Ответ 3

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

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