No momento que usamos 1 e 0 em condicionais, como no exemplo do vídeo: if @NUMERRO <> 0
, esta é uma referência a true e false?
Gostaria somente de confirmar se é isso mesmo.
No momento que usamos 1 e 0 em condicionais, como no exemplo do vídeo: if @NUMERRO <> 0
, esta é uma referência a true e false?
Gostaria somente de confirmar se é isso mesmo.
Olá Silva!
Especificamente na situação que gerou sua dúvida, não. Vou explicar partir da imagem do curso...
Vemos no código da imagem do curso que @NUMERRO é uma variável ue recebeu o valor da variável global @@ERROR, e a pergunta feita a vaiável @NUMERRO é se ela é diferente de zero.
A variavel global @@ERROR é uma variável de sistema que armazena o ID da ultima mensagem de erro gerada, E ESTE VALOR PERSISTE NESSA VARIÁVEL APENAS ATÉ O FIM DA EXECUÇÂO DE UM PROXIMO COMANDO, vontaltando assim ao seu valor original de zero, que dentota não haver erro. Sua boa utilização DEPENDE que ela seja lida logo após a execução do comando que se deseja verificar, para que possa ser encontrado ou não um ID, que é maior que zero (quando com erro), ou zero quando executado com sucesso (por isso aproxima execução limpa a variável).
Sendo assim, quando ele pergunta se é diferente de zero, ele está perguntando se algum ID de erro foi capturado (ID de erro gravado no sistema, ou gerado via código através de um raiserror, por exemplo). Se não foi encontrado, ele pode prosseguir. Se foi achado, tomará provid~encias via código, através dos controles de fluxo.
Para que você possa produzir um teste próprio para entendimento:
select @@error
raiserror('Sou uma mensagem de erro customizada!', 16,1)
select @@error
Ao rodar este trecho, verás que o primeiro SELECT retorna zero, e o segundo retorna 50000 (50000 é o ID das mensagem de erro customizadas que não provém de uma mensagem de usuário gravada na tabela "sys.messages" (esta é a tabele aque armazena tanto as mensagens de erro do SQL Server em todos os idiomas disponíveis, como as customizadas por usuários, que são gravadas sempre com ID a partir de 50001...)
Agora, faça este outro teste :
select @@error
raiserror('Sou uma mensagem de erro customizada!', 16,1)
raiserror(47800, 16,1)
select @@error
Como disse anteriormente, ele captura a última mensagem de erro gerada. Neste caso , capturou o do primeiro erro, e em seguida sobrepos com o erro do segundo, Por isso , em caso de uso para captura de @@ERROR , deve ser feito imediatamente após o comando que se avalia.
select @@error
raiserror('Sou uma mensagem de erro customizada!', 16,1)
raiserror(47800, 16,1)
select @@error
select @@error
Para finalizar, rode este último e observe que o ultimo SELECT , assim como o primeiro, virá zerado, pois após a apresentação do valor encontrado, este SELECT que apresenta já é motivo para que o valor seja dispensado...por isso fica novamente zerado.
Espero ter ajudado!
Obrigado, sua explicação foi completissíma.
Eu tinha buscado a resposta e vi que o retorno do tipo também interfere nesse loop.