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.
And that's it, folks!
Espero que tenham gostado do post.