如何在SQL Server的存储过程中转义字符串,以便在LIKE
表达式中使用它是安全的.
假设我有一个NVARCHAR
像这样的变量:
declare @myString NVARCHAR(100);
我想在LIKE
表达式中使用它:
... WHERE ... LIKE '%' + @myString + '%';
如何在T-SQL中转义字符串(更具体地说,对LIKE
模式匹配有意义的字符,例如%
或?
),以便以这种方式使用它是安全的?
例如,给定:
@myString = 'aa%bb'
我想要:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
匹配'aa%bb'
,'caa%bbc'
但不是'aaxbb'
或'caaxbb'
.
要转义LIKE表达式中的特殊字符,请在其前面加上转义字符.您可以选择使用ESCAPE关键字的转义字符串.(MSDN参考)
例如,这会转义%符号,使用\作为转义字符:
select * from table where myfield like '%15\% off%' ESCAPE '\'
如果您不知道字符串中将包含哪些字符,并且您不希望将它们视为通配符,则可以使用转义字符为所有通配符添加前缀,例如:
set @myString = replace( replace( replace( replace( @myString , '\', '\\' ) , '%', '\%' ) , '_', '\_' ) , '[', '\[' )
(注意你也必须转义你的转义字符串,并确保它是内部的,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
和所述ESCAPE
关键字.