web-dev-qa-db-fra.com

Comment valider et annuler une transaction sur un serveur SQL?

J'ai un énorme script pour créer des tables et transférer des données à partir d'un serveur. Donc, ce sceipt a essentiellement - 

  1. Créer des instructions pour les tables.
  2. Insert pour le portage des données sur ces tables nouvellement créées.
  3. Créez des instructions pour les procédures stockées. 

Donc j'ai ce code mais ça ne marche pas fondamentalement @@ ERROR est toujours nul je pense ..

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

Quelqu'un peut-il m'aider à écrire une transaction qui sera fondamentalement annulée en cas d'erreur et validée si tout va bien? Puis-je utiliser RaiseError d'une certaine manière ici ..

15
Vishal

N'utilisez pas @@ERROR, utilisez plutôt BEGIN TRY/BEGIN CATCH. Voir cet article: Traitement des exceptions et transactions imbriquées pour un exemple de procédure:

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
26
Remus Rusanu

Selon http://msdn.Microsoft.com/en-us/library/ms188790.aspx

@@ ERROR: Renvoie le numéro d'erreur de la dernière instruction Transact-SQL exécutée.

Vous devrez vérifier après chaque instruction pour pouvoir effectuer la restauration et le retour.

S'engager peut être à la fin.

HTH

2
Eben Roux

Évitez les références directes à '@@ ERROR' . C'est une petite chose volante qui peut être perdue.

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