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

Visualizações: 17.702 views
Tempo de Leitura: 2 minutos

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.

É isso aí, pessoal!
Espero que tenham gostado do post.