Eu enfrentei um fenômeno estranho hoje. Executei a consulta abaixo para localizar todas as solicitações com espera diferente de BROKER_RECEIVE_WAITFOR
select * from sys.dm_exec_requests where session_id > 55
and wait_type not like ('BROKER_RECEIVE_WAITFOR')
A consulta funcionou bem, mas falhou ao listar qualquer solicitação com No waits, ou seja, com wait_type como NULL (havia muitas consultas em execução sem nenhuma espera neste momento).
Por que isso está acontecendo, não deveria listar todos os registros com wait_type diferente de 'BROKER_RECEIVE_WAITFOR' incluindo nulos?
Estou executando o SQL Server 2008R2 SP3.
A razão para isso é que um NULL representa um valor desconhecido.
NULL não é
LIKE
nada e também não éNOT LIKE
nada.Tente executar as 2 instruções a seguir em seu sistema:
Isso deve retornar
false
para ambas as instruções.Portanto, sua consulta deve ficar assim:
Você teria que adicionar a verificação adicional para null
Você pode entender melhor essa situação consultando as informações neste link:
http://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/
Para mostrar nulos apenas para
session_id > 55
, você teria que usar parênteses para forçar a avaliação booleana correta:Você não precisa
LIKE
aqui.Na verdade, isso fornecerá uma semântica incorreta, pois
_
é um curinga para corresponder a qualquer caractere único. Portanto, sua consulta também excluiria incorretamente algumas outras strings (embora isso seja hipotético, pois não há nenhum tipo de espera com o qual possa entrar em conflito na prática).Uma outra abordagem possível para fornecer a semântica desejada é descrita aqui
Se você quiser incluir nulos, eu escreveria assim:
várias vezes, descobri que otimizadores lidam com COALESCE mais rapidamente do que
or xxx is null