在SQL Server中转义string,以便在LIKEexpression式中使用它是安全的
如何在SQL Server的存储过程中转义string,以便在LIKE
expression式中使用它是安全的。
假设我有一个NVARCHAR
variables,如下所示:
declare @myString NVARCHAR(100);
我想用LIKE
expression式来使用它:
... WHERE ... LIKE '%' + @myString + '%';
如何在T-SQL中转义string(更具体地说,对LIKE
模式匹配有意义的字符,例如%
或?
),以便以这种方式使用是安全的?
例如,给出:
@myString = 'aa%bb'
我想要:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
匹配'aa%bb'
, 'caa%bbc'
而不是'aaxbb'
或'caaxbb'
。
要在LIKEexpression式中转义特殊字符,您需要使用转义字符作为前缀。 您可以select使用ESCAPE关键字的转义字符。 ( MSDN参考 )
例如,这个转义%符号,使用\作为转义字符:
select * from table where myfield like '%15\% off%' ESCAPE '\'
如果您不知道string中的字符是什么,并且不想将它们当作通配符,则可以将所有通配符与转义字符相加,例如:
set @myString = replace( replace( replace( replace( @myString , '\', '\\' ) , '%', '\%' ) , '_', '\_' ) , '[', '\[' )
(注意,你必须逃避你的转义字符,并确保这是内部replace
所以你不会逃避从其他replace
语句添加的)。 那么你可以使用这样的东西:
select * from table where myfield like '%' + @myString + '%' ESCAPE '\'
还要记住给@myStringvariables分配更多的空间,因为它将会随着stringreplace而变长。
有一个类似的问题(使用NHibernate,所以ESCAPE关键字将非常困难),并使用括号字符解决它。 所以你的样品会变成
WHERE ... LIKE '%aa[%]bb%'
如果你需要certificate:
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
而不是转义string中的所有字符,在模式语法中具有特别的意义,因为您在模式中使用了前导通配符,这样做更快更容易。
SELECT * FROM YourTable WHERE CHARINDEX(@myString , YourColumn) > 0
在不使用前导通配符的情况下,应避免上述方法,因为它不能在YourColumn
上使用索引。
另外,如果最佳执行计划会根据匹配行的数量而有所不同,那么与CHARINDEX
和ESCAPE
关键字相比,使用带有方括号转义语法的LIKE
时,估计可能会更好。
您指定转义字符。 文档在这里:
http://msdn.microsoft.com/en-us/library/ms179859.aspx
你想查找包含转义字符的string吗? 比如你想要这个:
select * from table where myfield like '%10%%'.
你想在哪里search10%的所有字段? 如果是这种情况,则可以使用ESCAPE子句来指定转义字符并转义通配符。
select * from table where myfield like '%10!%%' ESCAPE '!'