Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como resolver o Warning Null value is eliminated by an aggregate or other SET operation

Post Views 19,075 views
Reading time 2 minutes

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.

SQL Server - Warning Null value is eliminated by an aggregate or other SET operation 2

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.

SQL Server - Resolvendo Solved Warning Null value is eliminated by an aggregate or other SET operation

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.