相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集
首先添加测试数据
create table templist(id int identity,name varchar(12), age int) go create index idx_age on templist (age) go declare @i int; set @i=0; while @i<10000 begin insert into templist (name, age)values(cast(@i as varchar),@i) set @i=@i+1; end go
1.有使用exec来避免全表扫描
declare @age int=666; declare @sql nvarchar(max) set @sql = 'select * from templist' if @age is not null set @sql = @sql + ' where age = @age' exec sp_executesql @sql, n'@age int', @age
或者条件少的情况下
declare @age int=666; if @age is not null select * from templist where age = @age else select * from templist
2.使用is null来实现
declare @age int=666; select * from templist where (@age is null or age = @age) select * from templist where (age = @age or @age is null) select * from templist where age=isnull(@age, age)
第一种方案,不会破坏索引,但冗余的代码看起来让人难受
第二种方案,会导致全表扫描(破坏索引)
以上是网上查阅的资料,方案二不符合sarg,问题在or,如果我不使用or,用and呢
declare @age int=666; select * from templist where @age is not null and age = @age
版权声明:本文原创发表于 博客园,作者为 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。