我今天遇到了一个奇怪的现象。我运行以下查询以查找除 BROKER_RECEIVE_WAITFOR 以外的所有等待请求
select * from sys.dm_exec_requests where session_id > 55
and wait_type not like ('BROKER_RECEIVE_WAITFOR')
查询运行良好,但它未能列出任何没有等待的请求,即 wait_type 为NULL(此时有相当多的运行查询没有任何等待)。
为什么会这样,难道它不应该列出所有 wait_type 的记录,而不是像 'BROKER_RECEIVE_WAITFOR' 包括 Nulls?
我正在运行 SQL Server 2008R2 SP3。
原因是 NULL 表示未知值。
NULL 不是
LIKE
任何东西,也不是NOT LIKE
任何东西。尝试在您的系统上运行以下 2 条语句:
这应该返回
false
两个语句。所以你的查询应该是这样的:
您必须添加 null 的额外检查
通过查看此链接中的信息,您可能会更好地了解这种情况:
http://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/
要仅显示 null
session_id > 55
,您必须使用括号来强制执行正确的布尔值计算:你不需要
LIKE
这里。事实上,这会给你不正确的语义,因为
_
它是匹配任何单个字符的通配符。因此,您的查询也会错误地排除某些其他字符串(尽管这是假设的,因为在实践中没有可能与之冲突的等待类型)。此处描述了另一种提供所需语义的可能方法
如果你想包含空值,我会这样写:
很多次我发现优化器处理 COALESCE 的速度比
or xxx is null