OlĂ¡ pessoal,
Boa noite!
Neste post vou falar sobre algo que Ă© muito comum de se encontrar no desenvolvimento de queries utilizando Transact-SQL (T-SQL) no SQL Server, que sĂ£o funções de agregaĂ§Ă£o ou agrupamento (Ex: SUM, MAX, MIN, AVG) em colunas que possuem valores NULL em seus registros. Quando isso acontece, Ă© gerado um alerta com essa mensagem:
Warning: Null value is eliminated by an aggregate or other SET operation.
Embora seja apenas um alerta, algumas aplicações podem apresentar erros interpretando o Warning como erro e retornando uma exceĂ§Ă£o. Neste post vou mostrar como evitar essa mensagem.
Utilizando SET ANSI_NULLS OFF
Embora seja uma “gambiarra”, infelizmente Ă© a “soluĂ§Ă£o” que eu mais vejo os desenvolvedores utilizando para evitar esse tipo de warning, principalmente por ser mais prĂ¡tico, rĂ¡pido e conhecido que as outras soluções.
Embora esse seja uma “soluĂ§Ă£o” muito ruim, existem soluções bem piores, como a SET ANSI_WARNINGS OFF.
Se vocĂª utiliza esse recurso em qualquer query que vocĂª jĂ¡ desenvolveu na vida, vocĂª PRECISA ler o post SQL Server – Porque NĂƒO utilizar SET ANSI_WARNINGS OFF.
Utilizando filtros
A soluĂ§Ă£o mais correta Ă© aplicar filtros na sua query para retornar apenas os registros vĂ¡lidos nas funções de agregaĂ§Ă£o. Essa soluĂ§Ă£o nĂ£o Ă© muito utilizada porque precisa ser feita manualmente em todas as queries e nem todos os desenvolvedores querem ter esse trabalho, embora seja a soluĂ§Ă£o recomendada e mais correta.
Enquanto a soluĂ§Ă£o utilizando os ISNULL Ă© inofensiva e sempre vai satisfazer essa necessidade, muito cuidado ao utilizar o filtro no WHERE como foi feito no exemplo 2. Apesar de parecer ser algo coerente, note que o valor do resultado final foi alterado.
Utilizar o ISNULL garante que a soma seja feita corretamente e os valores NULL sejam convertidos para zero sem comprometer o resultado final. Em contrapartida, ele Ă© menos performĂ¡tico que utilizar um filtro no WHERE para remover os casos que nĂ£o devem ser somados, mas esses filtros devem ser muito bem utilizados para nĂ£o alterar o resultado. EntĂ£o, utilize a melhor soluĂ§Ă£o conforme a sua necessidade.
É isso aĂ, pessoal!
Espero que tenham gostado do post.