Экранируйте строку в SQL Server, чтобы ее можно было безопасно использовать в выражении LIKE
как мне избежать строки в хранимой процедуре SQL Server, чтобы ее можно было безопасно использовать в LIKE выражение.
Предположим, у меня есть NVARCHAR переменной вот так:
declare @myString NVARCHAR(100);
и я хочу использовать его в LIKE выражение:
... WHERE ... LIKE '%' + @myString + '%';
как мне избежать строки (более конкретно, символы, которые имеют значение для LIKE сопоставление с образцом, например,% или ?) в T-SQL, так что это безопасно использовать в этом манеры?
например, дано:
@myString = 'aa%bb'
хочу:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
в матче 'aa%bb','caa%bbc' а не 'aaxbb' или 'caaxbb'.
5 ответов:
чтобы избежать специальных символов как выражения префикса с Escape-символ. Вы можете выбрать, какой escape-символ использовать с ключевым словом ESCAPE. ( MSDN Ref)
например, это экранирует символ%, используя \ в качестве escape char:
select * from table where myfield like '%15\% off%' ESCAPE '\'если вы не знаете, какие символы будут в вашей строке, и вы не хотите рассматривать их как подстановочные знаки, вы можете префиксировать все подстановочные знаки с помощью escape-символа, например:
set @myString = replace( replace( replace( replace( @myString , '\', '\' ) , '%', '\%' ) , '_', '\_' ) , '[', '\[' )(обратите внимание, что вы должны избежать вашего побега char тоже, и убедитесь, что это внутренний
replaceТак что вы не избежать те, которые добавлены из другихreplaceзаявления). Затем вы можете использовать что-то вроде этого:select * from table where myfield like '%' + @myString + '%' ESCAPE '\'также не забудьте выделить больше места для переменной @myString, поскольку она станет длиннее с заменой строки.
была аналогичная проблема (используя NHibernate, поэтому ключевое слово ESCAPE было бы очень сложно) и решило ее с помощью символов скобок. Так что ваш образец станет
WHERE ... LIKE '%aa[%]bb%'Если вам нужны доказательства:
create table test (field nvarchar(100)) go insert test values ('abcdef%hijklm') insert test values ('abcdefghijklm') go select * from test where field like 'abcdef[%]hijklm' go
вместо того, чтобы бежать все символы в строке, которые имеют особое значение в синтаксисе шаблона учитывая, что вы используете ведущих подстановочный знак в шаблоне это быстрее и проще всего сделать.
SELECT * FROM YourTable WHERE CHARINDEX(@myString , YourColumn) > 0в случаях, когда вы не используете ведущий подстановочный знак, следует избегать подхода выше, поскольку он не может использовать индекс на
YourColumn.кроме того, в случаях, когда оптимальный план выполнения будет варьироваться в зависимости от количества соответствующие строки оценки могут быть лучше при использовании
LIKEс квадратной скобкой, экранирующей синтаксис по сравнению с иCHARINDEXи theESCAPEключевое слово.
вы указываете escape-символ. Документация здесь:
http://msdn.microsoft.com/en-us/library/ms179859.aspx
вы хотите искать строки, содержащие escape-символ? Например, вы хотите этого:
select * from table where myfield like '%10%%'.где вы хотите искать все поля с 10%? Если это так, то вы можете использовать ESCAPE-предложение, чтобы указать escape-символ и избежать подстановочного знака.
select * from table where myfield like '%10!%%' ESCAPE '!'