Солнышко почти все понял :)
Запустите следующее в QA при установке SQL2005 по умолчанию
select * from sysobjects where name = 'sysbinobjs '
-- returns 1 row
select * from sysobjects where name like 'sysbinobjs '
-- returns 0 rows
Таким образом, LIKE не совпадает в конечных пробелах, на стороне плана запроса они работают почти одинаково, но объединение '=' работает чуть лучше.
Еще одна вещь, которую вы ДОЛЖНЫ иметь в виду при использовании LIKE, - это правильно экранировать строку.
declare @s varchar(40)
set @s = 'escaped[_]_%'
select 1 where 'escaped[_]_%' like @s
--Return nothing = BAD
set @s = '_e_s_c_a_p_e_d_[___]___%'
select 1 where 'escaped[_]_%' like @s escape '_'
--Returns 1 = GOOD
Как правило, люди не используют LIKE для точного сопоставления, потому что проблемы с побегом вызывают всевозможные осложнения и тонкие ошибки, люди забывают сбежать, и возникает боль.
Но ... если вы хотите получить точное точное соответствие, LIKE может решить эту проблему.
Скажем, вы хотите сопоставить имя пользователя с "sam" и не хотите получать "Sam" или "Sam", и, к сожалению, сортировка столбца не учитывает регистр.
Что-то вроде следующего (с добавленным побегом) - путь.
select * from sysobjects
WHERE name = 'sysbinobjs' and name COLLATE Latin1_General_BIN LIKE 'sysbinobjs'
Причина, по которой вы делаете двойное совпадение, состоит в том, чтобы избежать сканирования таблицы.
Однако ....
Я думаю, что трюк с варбинарным кастингом менее подвержен ошибкам и легче запоминается.