Which is why I was saying it should be decompiled down to it's logical equivalent, which will do the right thing:
create table #t (fname varchar(20))
insert #t (fname)
select top 100 'asdf'
from sysobjects
insert #t (fname) values ('zzzz')
create index a on #t (fname)
declare @fname varchar(20)
set @fname = 'asdf' --does index scan
select *
from #t
WHERE
CASE WHEN fname = @fname
THEN 1
ELSE 0
END = 1
dbcc freeproccache
go
declare @fname varchar(20)
set @fname = 'zzzz' --does index scan as well, even though only 1 row
select *
from #t
WHERE
CASE WHEN fname = @fname
THEN 1
ELSE 0
END = 1
dbcc freeproccache
go
declare @fname varchar(20)
set @fname = 'asdf' --does index seek, since covering and ordered
select fname
from #t
WHERE fname = @fname
dbcc freeproccache
go
declare @fname varchar(20)
set @fname = 'zzzz' --does index seek, since 1 row
select fname
from #t
WHERE fname = @fname
Best,
Kevin G. Boles
SQL Server Consultant
SQL MVP 2007-2012
TheSQLGuru on googles mail service