2010-10-14 10 views
15

Mam ogromny skrypt do tworzenia tabel i przenoszenia danych z jednego serwera. Więc ten zasób w zasadzie ma -Jak wykonać i wycofać transakcję na serwerze sql?

  1. Tworzenie instrukcji dla tabel.
  2. Wkładka do przenoszenia danych do nowo utworzonych tabel.
  3. Tworzenie instrukcji dla procedur składowanych.

Więc mam ten kod, ale nie działa w zasadzie @@ ERROR jest zawsze zero myślę ..

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 

Może ktoś mi pomóc napisać transakcję, która w zasadzie rollback w przypadku błędu i zobowiązać jeśli wszystko jest fine..Can używam RaiseError jakoś tutaj ..

Odpowiedz

26

Nie używaj @@ERROR, zamiast używać BEGIN TRY/BEGIN CATCH. Zobacz ten artykuł: Exception handling and nested transactions procedurę próbki:

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

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

@@ eRROR: Zwraca numer błędu dla ostatniego Transact-SQL oświadczenie wykonanie dane przetrząsać.

Będziesz musiał sprawdzić po każdym wyciągu, aby wykonać wycofanie i przywrócić.

Zobowiązanie może znajdować się na końcu.

HTH

0

unikać bezpośredniego odniesienia do '@@ ERROR'. Jest to małe, małe rzeczy, które można stracić.

Declare @ErrorCode int; 
... perform stuff ... 
Set @ErrorCode = @@ERROR; 
... other stuff ... 
if @ErrorCode ...... 
Powiązane problemy