2010-10-14 24 views
15

Tengo un script enorme para crear tablas y portar datos desde un servidor. Entonces este resumen básicamente tiene -¿Cómo comprometer y revertir la transacción en el servidor sql?

  1. Crear declaraciones para las tablas.
  2. Insertar para transferir los datos a estas tablas recién creadas.
  3. Crear declaraciones para procedimientos almacenados.

así que tengo este código pero no funciona básicamente @@ ERROR es siempre cero creo ..

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 

Puede alguien ayudarme a escribir una transacción que básicamente deshacer el error y cometer si todo es fine..Can utilizo RaiseError alguna manera aquí ..

Respuesta

26

No utilice @@ERROR, utilice BEGIN TRY/BEGIN CATCH lugar. Ver este artículo: Exception handling and nested transactions para un procedimiento de ejemplo:

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

Según http://msdn.microsoft.com/en-us/library/ms188790.aspx

@@ eRROR: Devuelve el número de error para la ejecu última declaración de Transact-SQL ted.

Deberá verificar cada declaración para realizar la reversión y el retorno.

Commit puede estar al final.

HTH

0

evitar referencias directas a '@@ ERROR'. Es una pequeña cosa frívola que se puede perder.

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