none
Problemas com Try e Raiserror RRS feed

  • Pergunta

  •  Gostaria de pedir a ajuda de vocês tenho essa rotina no sqlserver 2005, gostaria de retornar qualquer dos raiserror que foram informados, já tentei de várias formas. o raiserrror do if not exists não dispara somente o que está no bloco catch.

     

    Se alguém puder me ajudar ficarei grata.

     

     

    BEGIN TRY

    BEGIN TRANSACTION

    IF NOT EXISTS (SELECT CLASSFISCID FROM CLASSIFICACAO

    WHERE CLASSFISCID = @CLASSFISCID)

    BEGIN

    RAISERROR('CLASSIFICACAO_UPD - Classificação não existe!!!',11,1)

    RETURN

    END

    UPDATE CLASSIFICACAO

    SET CLASSFISCID = @CLASSFISCIDNEW,

    CLASSFISCDESC = @CLASSFISCDESC,

    CLASSFISCOBS = @CLASSFISCOBS

    wHERE CLASSFISCID = @CLASSFISCID

    COMMIT TRANSACTION

    END TRY

     

    BEGIN CATCH

    RAISERROR ('CLASSIFICACAO_UPD - Classificação Fiscal não alterada!!!',11,1);

    ROLLBACK TRANSACTION

    RETURN

    END CATCH

    sexta-feira, 14 de setembro de 2007 18:25

Todas as Respostas

  •  

    veja se a classificacao existe ou nao, no seu

     

     

    IF NOT EXISTS (SELECT CLASSFISCID FROM CLASSIFICACAO

    WHERE CLASSFISCID = @CLASSFISCID)

     

    fiz um teste aqui e deu certo o raise sem problemas, tente alterar o codigo para forcar entrar no not exists para vc. testar

     

    Abs;

     

    veja o exemplo

     

     

    -- Create Table #Exemplo (campo int)

    Begin Try

    If Not Exists (Select campo From #Exemplo where campo=1)

    Begin

    RaisError ('erro', 11,11)

    End

    Else

    Begin

    update #exemplo set campo = 2

    End

    End Try

    Begin Catch

    SELECT

    ERROR_NUMBER() AS ErrorNumber,

    ERROR_SEVERITY() AS ErrorSeverity,

    ERROR_STATE() AS ErrorState,

    ERROR_PROCEDURE() AS ErrorProcedure,

    ERROR_LINE() AS ErrorLine,

    ERROR_MESSAGE() AS ErrorMessage;

     

    end Catch

    sexta-feira, 14 de setembro de 2007 18:39
  • Boa tarde Marília, testa

     

    BEGIN TRY

    IF NOT EXISTS (SELECT CLASSFISCID FROM CLASSIFICACAO WHERE CLASSFISCID = @CLASSFISCID)

    BEGIN

    RAISERROR('CLASSIFICACAO_UPD - Classificação não existe!!!',11,1)

    RETURN

    END

    BEGIN TRAN

    --UPDATE CLASSIFICACAO SET CLASSFISCID = @CLASSFISCIDNEW,CLASSFISCDESC = @CLASSFISCDESC,CLASSFISCOBS = @CLASSFISCOBS wHERE CLASSFISCID = @CLASSFISCID

    COMMIT TRANSACTION

     

    END TRY

    BEGIN CATCH

     

    RAISERROR ('CLASSIFICACAO_UPD - Classificação Fiscal não alterada!!!',16,1);

    ROLLBACK TRANSACTION

    RETURN

    END CATCH

    sexta-feira, 14 de setembro de 2007 18:41
  •  

    Oi Marília,

     

     

    Siga o caminho indicado pelo Marcelo.

     

    Tens que cuidar com o RETURN, ele é uma saída incondicional do código!! O que significa que irá parar de executar ali. O TRY...CATCH é interessante para situações onde pode ocorrer algum erro, que você pode tratar.

     

     

    Abraço

    sexta-feira, 14 de setembro de 2007 18:55
  • Obrigada pelas respostas.

     

    eu sei que ele funciona. Mas só exibe a mensagem de erro, q está no bloco catch, eu gostaria de q caso ele verificasse o (if not exists) e não tivesse exibesse a msg. do not exists, caso ocorrese um outro erro de banco, vc. mostrado no catch. Só não sei se é possivel. Com o sql2000 através do @@error, era possível.

     

    Se vcs. puderem me ajudar vou ficar muito grata, de qq. forma obrigada.

     

     

    sexta-feira, 14 de setembro de 2007 19:08
  • Marilia,

     

    Mas na verdade o que esta acontecendo é o seguinte, no SQL Server 2005, foi incluído o conceito de bloco de tratamento de erros(try..catch), sendo que um bloco de tratamento de erros é processado em separado, ou seja, cada parte do código de compõem o bloco try...catch é considerado um bloco de transação por sessão.

     

    Neste caso, o que você esta tentando fazer, não tem muito sentido pois um bloco de código correspondente ao begin catch somente será executado no momento da ocorrência do erro, dentro da sessão e banco que você esta conectado.

     

    No SQL Server 2000, a variável de sistema @@Error, tem como objetivo verificar se algo de errado ocorrer, e permiter uma solução alternativa.

     

    O comando Return tem como objetivo sair de dentro do bloco e devolver o controle para try ou catch, isso vai depender do bloco que ele esta declarado.

    sexta-feira, 14 de setembro de 2007 20:15