Экранируйте строку в 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 '!'