Inquiridor
Problemas com Try e Raiserror

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)
CLASSFISCDESC
CLASSFISCOBS
= @CLASSFISCOBS wHERE CLASSFISCID = @CLASSFISCID COMMIT TRANSACTIONROLLBACK TRANSACTION
RETURN
END CATCH
Todas as Respostas
-
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 TryBegin
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 -
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 TRANSACTIONEND
TRY BEGIN CATCHEND
CATCH -
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
-
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.
-
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.