2010-10-14 5 views
15

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

  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 

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

ответ

26

Не используйте @@ERROR, используйте BEGIN TRY/BEGIN CATCH вместо этого. Смотрите эту статью: Exception handling and nested transactions для процедуры выборки:

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: Возвращает номер ошибки для заявления execut последнего Transact-SQL редактор

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

Обязательство может быть в конце.

НТН

0

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

Declare @ErrorCode int; 
... perform stuff ... 
Set @ErrorCode = @@ERROR; 
... other stuff ... 
if @ErrorCode ...... 
Смежные вопросы