• 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