none
Tratar Erro em procedure RRS feed

  • Pergunta

  • Estou com problemas para retornar erro em procedure, segue abaixo exemplo.

     

     

    Create table teste

    (
     codigo int primary key
    ,descr varchar(10)
    )

     

     

    -------------------------------

     

    --procedure

     

     

    Creat procedure proc_teste
    (
    @codigo int

    @descr varchar(10)
    )


    as


    DECLARE @Erro INT
    SET @Erro = 0

     

    Insert teste values(@codigo,@descr)


    IF (@@ERROR <> 0)
       SET @ErrorSave = @@ERROR

       RETURN @ErrorSave

     

    ----------------

     

    Para visualizar o erro utilizo:

     

    DECLARE @Retorno INT
    EXECUTE @Retorno = proc_teste @codigo = 1, @descr = 'teste'
    PRINT 'Retorno = ' + CAST(@Retorno AS CHAR(10))

     

     

    se eu executar 2x terei erro devido a PK, porem a variavel de retorno do erro sempre retorna 0.

     

    ----------------

    Server: Msg 2627, Level 14, State 1, Procedure proc_teste, Line 33
    Violation of PRIMARY KEY constraint 'PK__teste__29054EC6'. Cannot insert duplicate key in object 'teste'.
    The statement has been terminated.
    Retorno = 0        

    ----------------

     

     

     

     

     

    alguem sabe o pq não está retornando erro.

     

    grato,

     

     

     

     

     

     

     

     

     


     

     

     

     

     

    segunda-feira, 20 de outubro de 2008 18:50

Respostas

  • Fabiano,

     

    Quando se utiliza um bloco condicional que possui mais de duas linhas no bloco é necessário utilizar o comando Begin..End para que este bloco todo possar ser limitado e executado pelo o SQL Server, da maneira que você esta fazendo provavelmente o SQL Server não esta entendendo.

     

    Veja abaixo o exemplo:

     

    Code Snippet

    IF (@@ERROR <> 0)
     Begin

      SET @ErrorSave = @@ERROR

      RETURN @ErrorSave
    End

    Else

     Begin

      SET @ErrorSave = 1

      RETURN @ErrorSave
     End

     

     

     

    quarta-feira, 22 de outubro de 2008 23:08

Todas as Respostas

  • Boa Tarde,

     

    Seu SQL Server é 2005 ?

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 20 de outubro de 2008 19:19
  • é o SQL 2000.

     

     

    terça-feira, 21 de outubro de 2008 22:26
  • Bom Dia,

     

    Se você irá retornar o erro, o IF é dispensável, pois, se não houver erro o @@error será igual a zero (que é o valor Default do RETURN). Tente da seguinte forma:

     

    Code Snippet

    create procedure proc_teste

    (

    @codigo int,

    @descr varchar(10)

    )

     

    as

     

    DECLARE @Erro INT

    SET @Erro = 0

    Insert teste values(@codigo,@descr)

     

    return @@ERROR

     

     

    [ ]s,

     

    Gustavo

    quarta-feira, 22 de outubro de 2008 09:50
  • Fabiano,

     

    No SQL Server 2000, você terá somente a possibilidde de utilizar a system variable @@Error!!!

     

    Mas qual é a dificuldade que você esta tendo?

    quarta-feira, 22 de outubro de 2008 09:51
  • Junior,

    executando o codigo exemplo que postei, obtenho  mensagem abaixo ao executar a procedure:

     

    Server: Msg 2627, Level 14, State 1, Procedure proc_teste, Line 33
    Violation of PRIMARY KEY constraint 'PK__teste__29054EC6'. Cannot insert duplicate key in object 'teste'.
    The statement has been terminated.
    Retorno = 0       

     

    Esse valor de retorna sem esta como zero mesmo ocorrendo erro de PK e deveria ser direrente de zero sendo que ocorreu erro na pocedure.

     

    entendeu?

     

     

    grato,

     

     

    quarta-feira, 22 de outubro de 2008 16:23
  • Olá Fabiano,

     

    Minha sugestão não o atendeu ?

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 22 de outubro de 2008 17:19
  • Fabiano,

     

    Quando se utiliza um bloco condicional que possui mais de duas linhas no bloco é necessário utilizar o comando Begin..End para que este bloco todo possar ser limitado e executado pelo o SQL Server, da maneira que você esta fazendo provavelmente o SQL Server não esta entendendo.

     

    Veja abaixo o exemplo:

     

    Code Snippet

    IF (@@ERROR <> 0)
     Begin

      SET @ErrorSave = @@ERROR

      RETURN @ErrorSave
    End

    Else

     Begin

      SET @ErrorSave = 1

      RETURN @ErrorSave
     End

     

     

     

    quarta-feira, 22 de outubro de 2008 23:08
  • Olá, só obtive 0 como retorno, eu precisei colocar o Begin..End igual o Junior me passou abaixo.

     

    grato pela ajuda.

    quinta-feira, 23 de outubro de 2008 19:00